我一直在整个互联网上寻找答案,但没有明确的答案。
当前,NodeJS仅使用CommonJS语法加载模块,如果您确实要使用标准的ES2015模块语法,则必须事先对其进行转换,或者在运行时使用外部模块加载器。
目前,我不太愿意使用这两种方法,NodeJS维护人员是否计划支持ES2015模块?我完全没有发现任何提示。
目前,NodeJS 6.x声称支持96%的ES2015功能,但没有任何模块参考(NodeJS
ES2105支持链接
)。
您是否知道在不久的将来NodeJS是否会立即支持这些模块?
节点13.2.0及以上
NodeJS13.2.0现在支持不带标志的ES模块但是,该实现仍被标记为实验性的,因此在生产中使用时应谨慎。
要在13.2.0中启用ESM支持,请将以下内容添加到您的package.json
:
{
"type": "module"
}
所有.js
,.mjs
(或不带扩展名的文件)将被视为ESM。
除了整个package.json
加入,还有许多其他选项,有关详细信息,请参见13.2.0的文档。
节点13.1.0及以下
那些仍在使用旧版本Node的用户可能想尝试esm模块加载器,这是NodeJS
ES模块规范的生产就绪型实现:
node -r esm main.js
详细更新…
2019年4月23日
最近降落的PR更改了检测ES模块的方式:https :
//github.com/nodejs/node/pull/26745
它仍然落后--experimental-modules
,但是模块的加载方式发生了重大变化:
package.type
可以是module
或commonjs
type: "commonjs"
:.js
被解析为commonjstype: "module":
.js
被解析为esm--type=[mode]
让您在入口点上设置类型。将覆盖package.type
入口点。.cjs
。
module
方式导入commonjs 。--es-module-specifier-resolution=[type]
explicit
(默认)和node
--es-module-specifier-resolution=node
启用commonjs说明符解析算法--experimental-json-loader
"type": "module"
import 'thing.json'
都会独立于模式进入实验加载程序package.main
用来设置模块的入口点
2019年1月17日
节点11.6.0仍在标志后面将ES模块列为实验模块。
2017年9月13日
NodeJS 8.5.0已发布,在标志后面支持mjs文件:
node --experimental-modules index.mjs
计划是删除v10.0 LTS版本的标志。
-过时的信息。 出于历史目的保留在这里
2017年9月8日
并在--experimental-modules
标志后面启用:
package.json
{
"name": "testing-mjs",
"version": "1.0.0",
"description": "",
"main": "index.mjs" <-- Set this to be an mjs file
}
然后运行:
node --experimental-modules .
2017年2月:
https://medium.com/@jasnell/an-update-on-es6-modules-in-node-
js-42c958b890c#.6ye7mtn37
NodeJS伙计们认为 最糟糕的 解决方案是使用.mjs
文件扩展名。得出的结论是:
换句话说,给定两个文件
foo.js
和bar.mjs
,usingimport * from 'foo'
将被foo.js
视为CommonJS,而import * from 'bar'
将被bar.mjs
视为ES6模块
至于时间表…
在当前时间点上,在Node.js甚至开始着手支持ES6模块的实现之前,ES6和虚拟机方面仍然需要解决许多规范和实现问题。工作仍在进行中,但将需要一些时间-
我们目前 至少 需要一年左右的时间。
2016年10月:
Node.JS的开发人员之一最近参加了TC-39会议,并撰写了一篇关于实现Node.JS的阻止程序的绝妙文章:
https://hackernoon.com/node-js-tc-39-and-
modules-a1118aecf95e
基本的收获是:
*.mjs
似乎是最可能的解决方案,除非他们可以在无需用户输入的情况下准确检测出ES模块-原始答案-
这已经很长时间了。最重要的是,是的,Node最终将支持导入/导出模块的ES2015语法-
最有可能在最终确定并同意加载模块的规范时。
这是对
NodeJS保持良好状态的一个很好的概述。本质上,他们需要确保新规范适用于主要是有条件的,同步加载的Node以及主要是异步的HTML。
目前尚无人知道,但我想Node除了支持动态加载import/export
的新功能外,还将支持静态System.import
加载-
同时仍保留require
旧代码。
以下是一些有关Node如何实现此目标的建议:
我在网上到处找都找不到一个明确的答案。 当前Node.js仅使用CommonJS语法来加载模块,如果您真的想使用标准的ECMAScript 2015模块语法,那么您要么必须事先传输它,要么在运行时使用外部模块加载器。 目前,我不太愿意使用这两种方法中的任何一种,Node.js的维护人员是否计划支持ECMAScript2015模块?关于这一点,我根本没有找到任何提示。 目前,Node.js6.x声称
如果我使用ES6中的,那么我的所有Jest测试都会失败,并出现错误: 意外保留字 我将测试对象转换为使用老式IIFE语法,突然我的测试通过了。或者,以更简单的测试用例为例: 同样的错误。显然这里的导入/导出有问题。对我来说,仅仅为了让我的测试框架开心而使用ES5语法重写代码是不现实的。 我有巴别塔笑话。我尝试了GitHub问题的各种建议。这是不可能的。 有解决办法吗?
关于在ES6中使用导入导出,我得到以下错误: SyntaxError:导出声明只能出现在顶层 我上网找办法解决这个问题,但我做不到。谁能解释一下。我是ES6的新手,特别是导入和导出。(我使用StealJS完全是为了这种东西)谢谢! js文件有: 应用程序JS functions.js
我有一个javascript文件 当我使用es6导入/导出并执行时 这是一个未定义的给予。 它给出了一个空的module.exports对象。 我的问题是-为什么在es6导入/导出的情况下没有定义。
分支 开始时间 积极支持截止时间 安全维护截止时间 v4.3.x 2019-2-7 2019-9-30 2019-12-31 v4.4.x 2019-4-15 2020-4-30 2020-7-31 v4.5.x 2019-12-20 2020-12-31 2021-3-31 积极支持 受到官方开发组的积极支持,已报告的错误和安全问题将会立即被修复,并按照常规流程发布正式的版本。 安全维护 仅支持
问题内容: 我想知道配置模块导出的最佳方法是什么。在下面的示例中,“ async.function”可以是FS或HTTP请求,为示例起见简化了该请求: 这是示例代码(asynmodule.js): 如何仅在执行异步回调后导出模块? 编辑 有关我的实际用例的简短说明:我正在编写一个模块,用于在fs.exists()回调中配置nconf(https://github.com/flatiron/ncon