如何在ECMAScript 6中仅针对副作用进行模块导入与导出?
解决ES Module下批量导出Express路由的问题
你之前的写法不符合ES Module(ESM)语法规范,还错误地把路由数组改成了对象,导致Express无法正确挂载路由。下面是对应的正确实现方式:
1. 单个路由文件的ESM改造
先把每个路由文件改成ESM格式,比如src/routes/user.js:
import express from 'express'; const api = express.Router(); // 注意:如果doSomething是中间件函数,不要加()调用,除非它返回的是中间件 api.post('/user', doSomething); export default api;
2. 批量导出路由的index.js
在src/routes/index.js里,顶层导入所有路由实例,再组成数组导出:
import userRouter from './user.js'; import authRouter from './auth.js'; import demoRouter from './demo.js'; // 和CommonJS版本保持一致,导出路由实例数组 export default [ userRouter, authRouter, demoRouter ];
3. 服务文件的ESM写法
在src/handler.js中导入路由数组并挂载:
import express from 'express'; import apiRoutes from './routes/index.js'; const app = express(); // Express支持直接传入路由数组,会自动逐个挂载 app.use(apiRoutes); // 启动服务示例 app.listen(3000, () => { console.log('服务运行在3000端口'); });
关键注意事项
- 确保项目启用ESM:在
package.json中添加"type": "module",否则Node.js会默认按CommonJS解析文件。 - 你之前的错误点:ESM的
import语句必须放在模块顶层,不能嵌套在export default的对象里;同时Express的app.use无法处理你导出的对象,必须保持数组结构才能正确批量挂载路由。
内容的提问来源于stack exchange,提问作者lucas dellatorre
相关产品推荐
相关产品推荐

