晚上好。我遇到语法问题,正在迁移到babel,以下语法有问题。需要一个未命名的模块。在nodejs的默认导入中,我可以在不命名导出模块并传递应用程序的情况下进行导入,而在babel es6中,我找不到类似的东西,但可以正常使用。
默认节点
导出
router.get('/',(req, res) => res.send('test'))
module.exports = app => app.use('/test', router)
require()
require('./routes/uploader')(app)
通天塔
导出
router.get('/',(req, res) => res.send('test'))
export default app => app.use('/test', router)
导入
import router from './routes/uploader'
router(app)
在babel中,我只能通过命名然后将应用程序传递到路由器内部来执行导入。我做了很多研究,但没有找到更简单的方法。通过在babel上传递应用程序,您是否有更好的主意来导出路由器?
答案 0 :(得分:2)
require
仍然可以在Babel中使用。
import router from './routes/uploader'
router(app)
考虑到router
函数是./routes/uploader
的默认导出,是使用ES模块完成此操作的方式。它不特定于Babel。
router
导入名称是自记录的,可以在其不是功能而是其他功能的情况下进行调试。 require('./routes/uploader')(app)
是Node.js中常见的快捷方式,可能难以阅读和调试。
您是否有更好的主意通过将应用程序传递到babel来导出路由器?
import
语句应该进行静态分析,它不包含应该评估的代码。没有其他方法export
,ES模块是一个对象,所有导出都是对象属性,它是default
或命名为export。
尽管可以将模块设计为不需要将导出内容与函数包装在一起。
可以是整个应用程序中使用的app
实例。该应用程序应该有一个专用模块,以避免循环依赖:
app.js
export default express();
index.js
import app from './app';
import './routes';
app.listen(...);
routes.js
import app from './app';
app.get(...);
另一种比较流行的方法是将路由器与应用程序实例分离。可以安装快速路线,这是一个主要好处:
index.js
import router from './routes';
const app = express();
app.use(router)
app.listen(...);
route.js
const router = express.Router();
router.get(...);
export default router;
在某些情况下,用app => { ... }
包裹导出很有用,但是在这里没有必要。无论如何,对于确实需要app
实例的模块来说,这是一个很好的约定,例如到达app.locals
。