将CommonJS转换为ES模块

6

我业余时间写代码,目前正在开发一个新的NodeJS项目。基于我的有限知识,我认为使用ES模块是未来的趋势(如果我错了,请纠正我)。因此,我想将一些已经存在的CommonJS脚本重写成ES模块。

我在尝试转换下面这行代码时遇到了困难: require('./app/routes/routes')(app) (我不理解最后的“(app)”部分是做什么用的)。

routes.js:

module.exports = app => {
    const recipe = require('../controllers/recipe-controller.js');
    var router = require('express').Router();
    // Create a new Recipe
    router.post('/recipe', recipe.create);
    app.use('/api/recipes', router);
  };

server.js:

import express from 'express'
import db from './app/models/index'

const app = express();

app.get('/', (req, res) => {
  res.json({ message: 'Welcome to bezkoder application.' });
});
require('./app/routes/routes')(app);
const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}.`);
});
1个回答

6
这行代码:
require('./app/routes/routes')(app)

导入一个函数并调用它。从逻辑上讲,这与以下代码相同:

const init = require('./app/routes/routes');
init(app);

那么,要将此内容翻译为ESM格式,您需要将路由模块更改为导出一个具名函数。然后,您可以导入该具名函数并调用它(向其传递app参数)。
routes.js
import express from 'express';
import recipe from '../controllers/recipe-controller.js';

export function init(app) {
    // Create a new Recipe
    const router = express.Router();
    router.post('/recipe', recipe.create);
    app.use('/api/recipes', router);
}

server.js

import express from 'express'
import db from './app/models/index'
import init from './app/routes/routes';

const app = express();

app.get('/', (req, res) => {
  res.json({ message: 'Welcome to bezkoder application.' });
});

init(app);

const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}.`);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接