【问题标题】:How can i use es6 modules in node.js如何在 node.js 中使用 es6 模块
【发布时间】:2020-01-15 19:47:29
【问题描述】:

我正在尝试使用 ES6 语法将 express 导入我的项目,但它一直给我错误:

import express from "express";
SyntaxError: Unexpected identifier

我做了一些研究,发现人们说要添加:

“类型”:“模块”

到我已经完成的 package.json 文件:

...
"description": "Shopping list to learn the MERN stack",
  "type": "module",
  "main": "server.js",
  "scripts": {
    "start": "node server.js",
    "server": "nodemon server.js"
  },
...

但我仍然遇到同样的问题。我更喜欢使用 import ES6 语法而不是这种语法。

const express = require('express')

【问题讨论】:

  • 你按照什么教程来启用 es6 with node?​​span>
  • 我实际上已经阅读了几篇文章试图弄清楚这一点,但最新的(我能找到的)说要对节点 12 使用 "type":"module" 以启用 ES6 .
  • 您是否正在运行带有--experimental-modules 标志的节点?
  • 你用的是什么版本的Node?​​span>
  • 我使用的是 v12.4.0。我尝试了 --exeriemtal-modules 标志,但这似乎也不起作用。我仍然有问题。

标签: node.js express ecmascript-6


【解决方案1】:

解决方案:

对我来说,最好、最简单和最兼容的解决方法(日期为 2019 年 9 月)是:

  • npm install esm
  • 确保脚本由node 运行,并带有-r esm 选项。

就这么简单。


节点方式:

(根据ECMAScript Modules Documentation

除了package.json 中的"type": "module" 属性之外,NodeJS 需要通过node --experimental-modules <your_script.js> 运行脚本。

.mjs.js 扩展文件中的代码将通过对新 ES6 的支持进行处理。重命名我觉得很不方便。

注意: "type": "module" 对于支持 .js 文件尤为重要。阅读链接的文档。

NodeJS 提供的带有--experimental-modules 标志的解决方案在所有情况下都不适用于我。 ?‍♂️

添加esm 包更易于维护;并且可靠。一旦 ESM 支持不再是实验性的,就可以轻松/快速地删除。


题外话:

如果您想在您的 ES6 上运行测试 import/export 代码,我建议您依赖可靠/灵活的框架,例如 Mocha。

你可以关注this instructions to run Mocha tests supporting ES6

尝试 Jest 我无法成功运行测试。显然他们不想直接支持实验性 ES6 并建议转译代码(我讨厌的事情)。


参考资料:

【讨论】:

    【解决方案2】:

    如果你尝试用ES6语法运行Node js应用,你会遇到这种错误

    SyntaxError: Cannot use import statement outside a module
    

    让我们解决这个问题

    安装三个主要包

    npm install --save-dev @babel/core @babel/preset-env @babel/node
    npm install --save-dev nodemon
    

    用这个添加.babelrc文件

    { "presets": ["@babel/preset-env"] }

    这个在package.json

    "start": "nodemon --exec babel-node app.js"
    

    【讨论】:

      【解决方案3】:

      我创建了一个支持 es6 模块的 nodejs 样板。

      https://github.com/jasonjin220/es6-express-rest-api-boilerplate

      【讨论】:

        【解决方案4】:

        您需要 Babel 转译器来执行此操作,因为 Node.js 不支持 es6。

        首先将这些包添加到您的项目中:

        npm install --save-dev babel-cli babel-preset-es2015 rimraf
        

        然后,创建一个.babelrc 文件,这是Babel 转译器在转译过程中用来了解一些信息的。 touch .babelrc 然后,将此行添加到 .babelrc :

        {
          "presets": ["es2015"]
        }
        

        这告诉你的 Babel 按照 2015 标准使用 es6 预设。

        然后,修改 package.json 并告诉它使用 transpiler。

        "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",
        "build": "rimraf dist/ && babel ./ --out-dir dist/ --ignore ./node_modules,./.babelrc,./package.json,./npm-debug.log --copy-files",
        "start": "npm run build && node dist/index.js"
         },
        

        您必须在脚本部分添加以下内容,此行告诉您在运行 npm run start 时,转译器将首先将 es6 语法转换为最小的 JavaScript 语法,稍后再使用。

        检查你的依赖:

        "dependencies": {
        "express": "^4.15.2",
        "morgan": "^1.8.1",
        "rimraf": "^2.6.1"
         }
        

        和开发依赖:

        "devDependencies": {
        "babel-cli": "^6.24.0",
        "babel-preset-es2015": "^6.24.0"
        }
        

        这应该可以,如果有任何问题,请发表评论。

        【讨论】:

        • 节点 12,OP 说他们正在使用,确实支持 esm 导入语法并且不需要 babel。
        【解决方案5】:

        你需要使用 Babel,

        npm install --save-dev @babel/plugin-proposal-class-properties
        

        然后使用创建一个 .babelrc 文件,如果你没有它,带有选项:

        {"plugins": ["@babel/plugin-proposal-class-properties"]}
        

        然后在 package.json 中添加 devDependencies

        "@babel/plugin-proposal-class-properties": "^7.5.5",

        应该可以完成这项工作。

        【讨论】:

          【解决方案6】:

          好的,所以,在对 ES6 方式进行了更多研究之后,这对我有用。这是上面的答案和以下答案的组合:

          package.json

          node --experimental-modules server.mjs
          

          server.mjs

          import dotenv from 'dotenv'
          dotenv.config()
          
          const db = process.env.MONGO_URI
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-11-27
            • 1970-01-01
            • 1970-01-01
            • 2016-09-20
            • 2019-10-28
            • 2018-01-04
            • 2022-01-25
            相关资源
            最近更新 更多