在gulpfile.js中获得对ES6类的访问权限。
在gulpfile.js中获得对ES6类的访问权限。
我正在尝试在Node.js中掌握ES6的导入功能,并尝试使用此示例提供的语法:\n
Cheatsheet链接
\n我正在查看支持表,但我找不到支持新导入语句的版本(我尝试查找文本导入/ require)。我当前正在运行的是Node.js 8.1.2,而且我相信由于Cheatsheet是指.js文件,所以应该适用于.js文件。\n当我运行以下代码(从Cheatsheet的第一个示例中获取)时:\n
import { square, diag } from 'lib';
\n我收到以下错误:\n
\nSyntaxError: 意外的标记import。\n
\n我尝试导入的库的引用:\n
//------ lib.js ------ export const sqrt = Math.sqrt; export function square(x) { return x * x; } export function diag(x, y) { return sqrt(square(x) + square(y)); }
\n我错过了什么,如何使node
识别我的import
语句?
使用import
和export
在JavaScript文件中是不可能的。但是,自2018年5月起,在纯Node.js中可以使用上述功能,而无需使用任何模块,如Babel等。
以下是一种简单的方法来实现这一点。创建下面的文件,运行并查看输出结果。还别忘了查看下面的解释。
文件myfile.mjs:
function myFunc() { console.log("Hello from myFunc") } export default myFunc;
文件index.mjs:
import myFunc from "./myfile.mjs" // Simply using "./myfile" may not work in all resolvers myFunc();
运行:
node --experimental-modules index.mjs
输出:
(node:12020) ExperimentalWarning: The ESM module loader is experimental. Hello from myFunc
解释:
- 由于这是实验性模块,因此将.js文件命名为.mjs文件。
- 在运行时,您需要将
--experimental-modules
添加到node index.mjs
中。 - 在使用实验性模块运行时,输出中会显示"(node:12020) ExperimentalWarning: The ESM module loader is experimental."
- 我使用的是当前版本的Node.js,因此如果运行
node --version
,会得到"v10.3.0",尽管推荐版本是8.11.2 LTS。 - 将来的某一天,当这些功能稳定下来时,您可以使用.js而不是.mjs。
- 有关实验性功能的更多信息,请参见:https://nodejs.org/api/esm.html
根据以上内容,问题的原因是无法在gulpfile.js中访问ES6类。解决方法是使用上述提到的方法,创建.mjs文件并使用--experimental-modules
标志运行Node.js。
通过使用npm包esm,可以在Node.js中使用ES6模块。它不需要配置。使用esm,您将能够在JavaScript文件中使用export/import。
在终端上运行以下命令
yarn add esm
或
npm install esm
之后,您需要在启动服务器时使用node来引用这个包。例如,如果您的node服务器运行index.js文件,您将使用以下命令:
node -r esm index.js
您还可以像这样将它添加到您的package.json文件中:
{
"name": "My-app",
"version": "1.0.0",
"description": "Some Hack",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node -r esm index.js"
},
}
然后从终端运行此命令启动您的node服务器:
npm start
更多详细信息,请查看此链接:https://www.wisdomgeek.com/development/web-development/how-to-import-export-es6-modules-in-node/
似乎我在使用星号符号导入时遇到了问题。例如:`import * as log from 'loglevel';`
我希望在尝试使用import * as log 'loglevel'之前,您能从'loglevel'导出您的函数。
这真是太棒了!不幸的是,它在Jest中不起作用。
这是与TypeScript一起使用的最佳选项,因为ts-node加载器使.mjs扩展名变得不可行。`node -r esm -r ts-node/register index.ts`
注意:破坏了TS reflect-metadata:https://github.com/standard-things/esm/issues/809
问题的原因是需要在gulpfile.js中访问ES6类,而gulpfile.js默认不支持ES6模块导入/导出语法。解决方法是使用npm包esm,通过在终端运行命令`yarn add esm`或`npm install esm`来安装esm。安装后,在启动gulpfile.js之前,需要使用node引用esm包。可以通过在终端运行命令`node -r esm gulpfile.js`来启动gulpfile.js。
问题的原因是使用gulpfile.js文件时无法访问ES6类。解决方法是根据Node.js的版本不同采取不同的操作。
如果Node.js版本在v13及以上,解决方法如下:
- 将文件保存为.mjs扩展名,或者
- 在最近的package.json中添加{"type": "module"}
如果Node.js版本在9.6 - 12之间,解决方法如下:
- 将文件保存为.mjs扩展名,并使用以下命令运行:node --experimental-modules my-app.mjs
- 或者在package.json中添加{"type": "module"},并使用以下命令运行:node --experimental-modules my-app.js
对于使用.mjs文件的方法,需要注意在.mjs文件中使用require语句会导致错误。可以使用.js文件扩展名,并在package.json中添加{"type": "module"},然后使用以下命令运行:node --experimental-modules my-app.js。
需要注意的是,在导入模块时,需要写入完整路径并添加.js扩展名,否则Node.js会抛出错误。
以上是解决在gulpfile.js中无法访问ES6类的方法。更多信息可以参考Node.js文档:nodejs.org/api/esm.html#esm_package_json_type_field。