时代变化太快,快到 node lts 已经更新到 12 了,依稀还记得那天,几年前的我,还在用着 node 4+版本,转眼间 node 已经 发布了 12lts,我也由一个蓬勃向上的少年,变成了一个咸鱼届的大佬。学不动了学不动了,好的,没有关系,我相信很多人是这样的状态,不要急,学不学的动,不重要,我们先康康到底有啥,至少,还剩一张嘴。
import/export 脱离 --experimental-modules
说是这样说没错了,亲测了下
// needImport.js
export default '123';
// index.js
import sth from 'needImport';
console.log(sth);
这样还是不行,默认语法下还是不支持js的esm形态。换成如下模式就可以了吧?
// needImport.mjs
export default '123';
// index.mjs
import sth from 'needImport';
console.log(sth);
实测,还是不行,大猪蹄子,说好lts之后就可以关掉呢,为什么node index.mjs还是走internal/modules/cjs/loader.js:1007,童话里都是骗人的,实测一下,如果想用import/export语法,还是要用experimental-modules,不过目前的lts只是之前的current直接升lts了,等一等应该就可以了。
--experimental-modules 新增了一些功能
功能包括:
1. 可以在package.json文件中顶级位置增加"type": "module"的形式,让你的js文件变成mjs文件
妙啊,就是我之前这么多.mjs文件,要特么手动改一下了。但是这个更新之后,我发现一个奇怪的问题:
// a/index.js
export default '123';
// index.js
import sth from './a';
原本在cjs模式下,我们都知道当直接引用文件夹a的时候,如果如果发现a是个文件夹,会默认调用a/index.?js来调用,但是12的--experimental-modules似乎取消了这个特性,我查了下相关 issue ,发现有相当长的讨论,关于是否默认调用index.?js这个事情。官方的说法是不一定所有人都会认为index是默认,有些人可能认为main是默认,所以需要一个新的参数--es-module-specifier-resolution=node,这个参数下会以require的模式加载。
2. .cjs扩展名
.cjs扩展名明确文件被视为commonjs,好像就是后宫移位了,esm成功上位,cjs逐步要进入冷宫了。
3. --input-type flag
使用--input-type = module将字符串输入(通过--eval,--print或STDIN)作为ES模块运行。 --input-type标志可以是--input-type = module或--input-type = commonjs。
4. 明确的文件名
哎,这里就是了,新的实验模块的默认情况下,会启用明确的文件名,也就是 1 里面提到的问题,--es-module-specifier-resolution=node会按照 CommonJS-style 自动扩展解析,--es-module-specifier-resolution=explicit则表示要明确文件名。Package Name不受影响。
5. module.createRequireFromPath
ES模块中未定义"CommonJS globals"(require, exports, module, __filename, __dirname)。但是,module.createRequireFromPath()可用于创建要在ES模块上下文中使用的CommonJS require函数。
6. import for JavaScript only
现在.json不能被直接用import引用了,不过新增了--experimental-json-modules这个flag,嗯,加了就可以import fjson from 'json';
private
类里现在可以使用 private prop 了,不过 vscode 会有个红色警告,并没有办法去掉,告辞。
class Hello {
#world = 'hello, world';
print() {
console.log(this.#world);
}
}
new Hello().print();
v8 引擎升级
改善了启动性能
node12 将在构建时间之前为内置库构建代码缓存,并将其作为二进制文件嵌入。主线程能够使用此代码缓存将启动时间缩短30%。
TLS
Node现在支持TLS 1.3,它提供了更高的安全性并减少了延迟。 TLS 1.3是对该协议的重大更新,并且正在通过Web进行积极集成。通过实施TLS 1.3,Node应用程序将增加最终用户的隐私,同时还可以通过减少HTTPS握手所需的时间来提高请求的性能。此外,默认情况下已禁用TLS 1.0和1.1,并且加密库已删除不推荐使用的功能。
堆大小改进
以前使用默认的V8堆大小,对应于700MB(32位系统)或1400MB(64位系统)。现在,node将根据可用内存确定堆大小,这将确保其使用的资源不超过允许的资源。
堆转储功能
node12 提供了生成堆转储的功能,使调查内存问题更加容易。
实验诊断报告
通过提供实验性诊断报告功能,Node提供了改进的诊断应用程序中问题(性能,CPU使用率,内存,崩溃等)的能力。
本机模块N-API的改进
N-API的发布是为了提供一个更稳定和本机的Node模块系统,该系统通过在本机JavaScript API上提供ABI稳定的抽象来防止库在每次发行时都中断。node12 结合工作线程提供了对N-API的改进支持。
其他
- 辅助线程不再需要标志
http已将其默认解析器更新为llhttpassert验证所需的参数并调整松散的断言buffer改进使其更加稳定和安全async_hooks删除不推荐使用的功能global.process,global.Buffer的getters改善process- A new welcome message for repl(???)
看完之后,大概是这样的想法:
脑子:啊,我会了
写代码的脑子:我会了个p
好了,总之,借由这次 lts 的发布,我们回顾了一下 node12 带来的变化,请大家看清现实,拥抱变化。

更多精彩内容,尽在 ihap 技术黑洞
参考资料 github.com/nodejs/node… github.com/nodejs/modu… levelup.gitconnected.com/whats-new-i… github.com/nodejs/node…
记得要点赞、分享、评论三连,更多精彩内容请关注ihap 技术黑洞!