尝试从另一个 javascript 文件导入时,出现此错误
SyntaxError: Cannot use import statement outside a module
。这是我第一次尝试这样的事情。主文件是main.js
,模块文件是mod.js
。
main.js:
import * as myModule from "mod";
myModule.func();
mod.js:
export function func(){
console.log("Hello World");
}
我该如何解决这个问题?谢谢
为了使用导入语法(ESModules),您需要将以下内容添加到顶层的 package.json 中:
{
// ...
"type": "module",
}
如果您使用的 Node 版本早于 13,则在运行程序时还需要使用
--experimental-modules
标志:
node --experimental-modules program.js
使用commonjs语法代替es模块语法:
module.exports.func = function (){
console.log("Hello World");
}
和
const myMod = require("./mod")
myMod.func()
否则,如果你想使用 es 模块,你必须按照 Achraf Ghellach 的建议进行操作
对于浏览器(前端): 在您的 script 标签内添加 type = "module" 即
<script src="main.js" type="module"></script>
对于nodejs: 在您的
package.json文件中添加
"type": "module"
{
"name": "",
"version": "",
"description": "",
"main": "",
"type": "module",
....
}
我最近遇到了这个问题。这个解决方案类似于最受好评的答案,但我发现有些方法对我有用。
在与模块相同的目录中创建一个package.json文件并添加
"type":"module"
。然后使用导入{func} from "./myscript.js";
。使用节点运行时导入样式有效。
除了上面的答案之外,请注意默认情况下(如果省略“类型”)“类型”是“commonjs”。因此,当它是“模块”时,您已经明确指定了类型。您不能在模块外部使用 import 语句。
如果您在浏览器中(而不是 Node 环境),请确保在
type="module"
标记中指定 script
属性。如果你想使用Babel,那么它必须是type="text/babel" data-plugins="transform-es2015-modules-umd" data-type="module"
。
我遇到了同样的问题,但在另一个模块(python-shell)中。 我替换的代码如下:
import {PythonShell} from 'python-shell'; (original code)
let {PythonShell} = require('python-shell')
问题就解决了。
我在尝试使用打字稿运行摩卡测试时遇到了这个问题。这与答案没有直接关系,但可能会有所帮助。
这篇文章很有趣。他使用了一个涉及
cross-env
的技巧,这允许他以 commonjs 模块类型运行测试。这对我有用。
// package.json
{
...
"scripts": {
"test": "cross-env TS_NODE_COMPILER_OPTIONS='{ \"module\": \"commonjs\" }' mocha -r ts-node/register -r src/**/*.spec.ts"
}
}
您可以通过
node --experimental-modules
运行js脚本,而无需更改package.json
,如下所示:
node --experimental-modules ./path/to/your/js/script.mjs
请注意,您需要将脚本扩展名更改为
.mjs
,否则会出现SyntaxError: Cannot use import statement outside a module
错误。