首页 > 解决方案 > 为什么 node.js 会忽略 package.json 文件中的“类型”设置?

问题描述

节点版本:

节点-v
v12.13.0

我阅读了有关在 Node.js 中使用 ES 模块的文档

Node.js 将视为CommonJS所有其他形式的输入,例如.js 最近的父package.json文件不包含顶级 "type"字段的文件

这是我的package.json文件:

{
  "type": "module",
  "name": "sandbox",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node ./src/index.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "ramda": "^0.26.1"
  }
}

这是我的./src/index.js

import R from "ramda";
const src = {name:"Bob",age:7};
const _src = R.clone(src);
console.log(_src);

我尝试通过npm startor启动我的代码,node ./src/index.js但我得到了错误:

从“ramda”导入 R;
^^^^^^

SyntaxError: 不能在模块外使用 import 语句

为什么会这样?即为什么节点忽略我的"type": "module"设置?

同时它工作正常:

node --experimental-modules .\src\index.js

标签: javascriptnode.js

解决方案


在 Node 12 中,您需要运行带有--experimental-modules标志的 node 以启用对 ECMAScript 模块的支持。

import是 ES6 的一部分,默认情况下 NodeJS 还不支持它。它可以通过将 import 替换为require. 或者你可以在这里.babelrec回答。

同样对于 ES 模块的使用,“main”的值必须是包含扩展名的完整路径:“./src/index.js”,而不是“index.js”。

{
  "type": "module",
  "main": "./src/index.js"
  "scripts": {
    "start": "node --experimental-modules ./src/index.js"  
  },
}

推荐阅读