【问题标题】:Why is 'type: module' in package.json file?为什么 package.json 文件中有“类型:模块”?
【发布时间】:2020-08-07 14:52:10
【问题描述】:

我升级了节点并构建了现有文件。

但它没有构建,并且出现错误。

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module:                          │
   │   ~~/nuxt.config.js                                      │
   │   require() of ES modules is not supported.                                            │
   │   require() of ~~/nuxt.config.js from                    │
   │   ~~/config.js is an ES   │
   │   module file as it is a .js file whose nearest parent package.json contains "type":   │
   │   "module" which defines all .js files in that package scope as ES modules.            │
   │   Instead rename nuxt.config.js to end in .cjs, change the requiring code to use       │
   │   import(), or remove "type": "module" from                                            │
   │   ~~/package.json.  

所以我删除了 package.json 文件中的 'type: module'。

可以去掉吗?

【问题讨论】:

    标签: node.js vue.js nuxt.js


    【解决方案1】:

    package.json 文件中有'type': 'module' 时,您的源代码应使用import 语法。当你没有的时候,你应该使用require语法。

    'type': 'module' 添加到package.json 启用ES 6 模块。如需更多信息,请参阅here

    【讨论】:

    • @Alex "type": "module" 用于 ES 模块。我相信你应该删除你的评论。还要检查developer.okta.com/blog/2019/12/04/whats-new-nodejs-2020
    • 我认为 Alex 想说的是从 package.json 中省略 type 与将其设置为 CJS 具有相同的效果。 (这就是规范所说的:“如果最近的父 package.json 缺少“type”字段,或者包含“type”:“commonjs”,.js 文件被视为 CommonJS。如果达到卷根并且没有包.json 被找到,Node.js 遵循默认,一个没有“类型”字段的 package.json。”)
    • 啊,逗号​​有什么不同!不,“类型”:模块意味着....不正确,但是没有类型:模块意味着....是正确的哈哈。请澄清@alex
    • 需要注意的是:它将适用于所有出口。所以我还不知道commonjs和ESM怎么混用。
    【解决方案2】:

    2021 年年中更新

    如果您使用的是 Node.js v14,并且您应该使用它,因为它是 LTS,您只需要使用 type: module,如下所述:https://blog.logrocket.com/es-modules-in-node-today/


    如果由于某些原因您仍然坚持使用较低版本的 Node.js,您可以关注 Flavio 的这篇博文:https://flaviocopes.com/how-to-enable-es-modules-nodejs/

    然后执行以下操作:

    • 在您的package.json 中添加"type": "module"
    • 启动应用时使用--experimental-modules,例如:node --experimental-modules app.js

    或者你可以这样做:

    • 在您的package.json 中添加"type": "module"
    • .mjs 扩展名重命名您的文件,最终结果将如下所示node app.mjs

    【讨论】:

    • 除非我遗漏了什么,否则您仍然需要 (a) 在 package.json 中声明 "type": "module" 或 (b) 在使用 Node 14 时使用 .mjs 文件扩展名(使用 14.17 版测试。 3)。否则你会从 Node 收到一个错误,例如 Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.SyntaxError: Cannot use import statement outside a module。这也适用于节点 16.5.0。
    • @superEb Nvm,你说得对,type: module 仍然是必需的。我的错:blog.logrocket.com/es-modules-in-node-today
    【解决方案3】:

    @AfsharMohebi 的回答非常好,涵盖了最有用的要点。

    这个答案是在 CI/CD 管道周围添加一些颜色,其中可能需要利用添加一个动态的 type 参数来执行用 ES6 JavaScript 编写的节点代码。此外,我知道这与 OP 的问题无关,但 Google 把我带到了这里,因此希望其他人发现这对我有用。

    特别是,我们可以根据node docs 使用--input-type=module如果我们没有package.json,包括type: module

    例如,我使用下面的命令来测试一个npm包是否上传成功并且可以使用:

    mkdir test-mypkg && cd test-mypkg 
    echo "import { myFunc } from '@myname/myPkg';" > test.js 
    npm i @myname/myPkg @babel/core @babel/node && cat test.js | node --input-type=module
    

    注意:babel 依赖项包含在完整的 ES6 到 ES5 转换中,可能/可能不需要。此外,您可能应该固定您正在测试的软件包 myPkg 的版本!

    【讨论】:

      【解决方案4】:

      最近出现了很多问题 - 我认为 node 推出了更新并终止了应用程序。 将节点回滚到以前的版本 - 这解决了我的问题

      这里可以找到老年人:https://nodejs.org/en/download/releases/

      【讨论】:

      • 是的,这正是发生在我身上的事。
      猜你喜欢
      • 2021-05-27
      • 2017-07-31
      • 1970-01-01
      • 2018-06-03
      • 2022-12-29
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多