咸鱼你该翻身起来学习了,node lts 12正式发布

1,393 阅读5分钟

时代变化太快,快到 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);

这样还是不行,默认语法下还是不支持jsesm形态。换成如下模式就可以了吧?

// 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已将其默认解析器更新为llhttp
  • assert验证所需的参数并调整松散的断言
  • buffer改进使其更加稳定和安全
  • async_hooks删除不推荐使用的功能
  • global.processglobal.Buffergetters改善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 技术黑洞!