Node.js环境下使用ES6 import组织Express路由文件夹的问题
Express项目ES6模块路由注册实现方案
前置准备
首先确保Node.js环境启用ES模块支持,在项目根目录的package.json中添加配置:
{ "type": "module" }
开启后Node.js会以ES模块规范解析.js文件,同时导入路径需要补全完整文件后缀,不可省略.js/.mjs等后缀名。
方案1:静态导入(推荐常用场景)
直接在入口文件静态导入路由模块导出的注册函数,调用时传入express实例即可,逻辑和原CommonJS写法完全一致:
入口文件代码
import express from 'express' // 导入路由入口的默认导出,注意补全.js后缀 import registerRoutes from './routes/index.js' const app = express() // 直接调用注册函数传入app实例 registerRoutes(app) app.listen(3000, () => console.log('服务启动'))
路由入口(./routes/index.js)代码示例
如果你的路由文件夹是统一入口管理多个子路由,写法如下:
import registerDeviceIdRoute from './devices_id.js' // 默认导出接收app参数的注册函数,和原有逻辑一致 export default (app) => { registerDeviceIdRoute(app) // 其他路由注册逻辑依次添加即可 }
你现有的devices_id.js导出写法无需修改,完全符合ES模块规范。
方案2:动态导入(适配你使用import()的场景)
import()是动态导入语法,返回Promise对象,需要等待异步加载完成后才能拿到导出的注册函数:
写法1:Promise链式调用
import express from 'express' const app = express() import('./routes/index.js').then(module => { // 模块的default属性对应你导出的注册函数 const registerRoutes = module.default registerRoutes(app) })
写法2:顶层await(Node.js 14.8及以上版本支持)
import express from 'express' const app = express() const { default: registerRoutes } = await import('./routes/index.js') registerRoutes(app)
注意事项
- ES模块不支持
require、module.exports、__dirname等CommonJS专属API,切换全量ES模块时需要统一修改对应写法。 - 若无需路由懒加载等特殊逻辑,优先使用静态导入写法,性能更好且逻辑更清晰。
内容的提问来源于stack exchange,提问作者Bruno Carvalho
相关产品推荐
相关产品推荐

