
2023 å¹´ 4 æ 18 æ¥ã«ãªãªã¼ã¹ããã Node.js v20 ã®ä¸»ãªå¤æ´ç¹ãç´¹ä»ãã¾ãã
- ãã¡ã¤ã«ã®ã¢ã¯ã»ã¹ãããã»ã¹ã®èµ·åãå¶éããæ°ãããã¼ããã·ã§ã³ã¢ãã« (experimental)
- V8 11.3 ã«ããæ°ãã JavaScript ã®æ©è½
- ãã¹ãã©ã³ãã¼ï¼node:testï¼ã stable ã«ææ ¼
- Single Executable Application JSON ã® config ã使ã£ã Blob ãå¿ è¦ã«ãªã£ã
- ESM Loaders API ã® Worker å ã§ã®å®è¡
- Ada 2.0 ã«ãã URL ãã¼ãµã¼ã®é«éå
- Web Crypto API ã WebIDL ã«åããã¦äºææ§æ¹å
- Deprecation and Removals
- ãã®ä»ã®å¤æ´
- ã¾ã¨ã
- åèè¨äº
ãã¡ã¤ã«ã®ã¢ã¯ã»ã¹ãããã»ã¹ã®èµ·åãå¶éããæ°ãããã¼ããã·ã§ã³ã¢ãã« (experimental)
å®é¨çãªæ©è½ã¨ã㦠Process-based Permission Model ã¨ããæ©è½ã追å ããã¾ããã
Node.js ã®ããã»ã¹ããæ¬¡ã®äºãå¶éãã¾ãã
- ãã¡ã¤ã«ã®èªã¿è¾¼ã¿
- ãã¡ã¤ã«ã®æ¸ãè¾¼ã¿
- åããã»ã¹ï¼child_processï¼ã®å©ç¨
- Worker Threads ã®å©ç¨
ããã«ããæªæã®ããããã°ã©ã ã誤ã£ã¦å®è¡ãã¦ãã¾ã£ã¦ãã³ã³ãã¥ã¼ã¿å ã®ãã¡ã¤ã«ã®èªã¿è¾¼ã¿ã«ããæ å ±æ¼ããããã¡ã¤ã«ã®æ¹ãããæªæã®ããããã°ã©ã ã®å®è¡ãé²ããã¨ãã§ãã¾ãã
ãããã許å¯ããããã®ãã©ã°ãç¨æããã¦ãã¾ãï¼å¾è¿°ï¼ã
--allow-fs-read: ãã¡ã¤ã«ã®èªã¿è¾¼ã¿ã許å¯--allow-fs-write: ãã¡ã¤ã«ã®æ¸ãè¾¼ã¿ã許å¯--allow-child-process: child_process ã®å®è¡ã許å¯--allow-worker: Worker Threads ã®å®è¡ã許å¯
Deno ã®ãã¼ããã·ã§ã³ã¢ãã«ã«å¤§å¤ä¼¼ã¦ãã¾ãã
Node.js ã® Permission Model ã® API ããã¥ã¡ã³ãã¯æ¬¡ã®ãªã³ã¯å ã«ããã¾ãã
ããã¯ã¾ã å®é¨çãªæ©è½ã®ãã Node.js ãå®è¡ããã¨ãã« --experimental-permission ã¨ãããã©ã°ãå¿
è¦ã§ãã
$ node --experimental-permission index.js
ä¾ã¨ãã¦ã以ä¸ã®ãã㪠Node.js ã®ããã°ã©ã ããã£ãã¨ãã¾ãã
const fs = require("node:fs"); const path = require("node:path"); fs.readFileSync("/path/to/test.txt");
ãã®ããã°ã©ã ã¯åç´ã«test.txtã¨ãããã¡ã¤ã«ãèªã¿è¾¼ãã ãã§ããå®è¡ããã¨ä»¥ä¸ã®ãããªçµæãå¾ããã¨ãã§ãã¾ãã
$ node index.js Hello
--experimental-permissionãä»ä¸ãããã¨ã§ãã¡ã¤ã«èªã¿è¾¼ã¿ãå¶éãã¨ã©ã¼ã¨ãã¦å®è¡çµäºãã¾ãã
$ node --experimental-permission index.js
node:internal/modules/cjs/loader:179
const result = internalModuleStat(filename);
^
Error: Access to this API has been restricted
at stat (node:internal/modules/cjs/loader:179:18)
at Module._findPath (node:internal/modules/cjs/loader:651:16)
at resolveMainPath (node:internal/modules/run_main:15:25)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:76:24)
at node:internal/main/run_main_module:23:47 {
code: 'ERR_ACCESS_DENIED',
permission: 'FileSystemRead',
resource: '/path/to/index.js'
}
Node.js v20.0.0
--allow-fs-read ã§ãã¡ã¤ã«ã®èªã¿è¾¼ã¿ã許å¯ãã
ç¹å®ã®ãã¡ã¤ã«ã®èªã¿è¾¼ã¿ã¯è¨±å¯ãããã±ã¼ã¹ã¯ããã¨æãã¾ãã
ãããã£ãå ´å㯠--allow-fs-read ã¨ãããã©ã°ãä»ä¸ãã¾ãã
ãã¨ãã°ã/path/to/allowedã¨ãããã£ã¬ã¯ããªå
ã«ãããã¡ã¤ã«ãèªã¿è¾¼ã¿ããã¨ãã¯æ¬¡ã®ããã«æå®ãã¾ãã
$ node --experimental-permission --allow-fs-read=/path/to/allowed index.js
/path/to/allowdãã許å¯ããã¦ããªãã®ã§ãä»ã®ãã£ã¬ã¯ããªå
ã®ãã¡ã¤ã«ã¯è¨±å¯ããã¾ããããã ãããµããã£ã¬ã¯ããªã¯è¨±å¯ããã¾ãã
fs.readFileSync("/path/to/allowed/test.txt"); // OK fs.readFileSync("/path/to/allowed/sub/test.txt"); // ãµããã£ã¬ã¯ããªã¯OK fs.readFileSync("/path/to/forbidden/test.txt"); // å¥ãã£ã¬ã¯ããªã¯NG fs.readFileSync("/path/to/test.txt"); // 親ãã£ã¬ã¯ããªãNG
ãã¹ã¦ã®ãã¡ã¤ã«èªã¿è¾¼ã¿ã許å¯ãããã¨ã㯠--allow-fs-read=* ãæå®ãã¾ãã
$ node --experimental-permission --allow-fs-read=* index.js
macOS ã® zsh ã使ã£ã¦ããå ´å㯠--allow-fs-read=* ã§ã¯ãªãã--allow-fs-read=\* ã¨ããªããã°ãããªãç¹ã«æ³¨æãã¦ãã ãããmacOS ã§ã bash ã®å ´åã--allow-fs-read=* ã§å®è¡ã§ãã¾ããã
è¤æ°æå®ããå ´åã¯ã,ã§åºåã£ã¦æå®ãã¾ãã
$ node --experimental-permission --allow-fs-read=/path/to/allowed,/home index.js
éçè§£æãã¼ã«ãªã©ã使ã£ãããã¸ã§ã¯ãé ä¸ã®ãã¡ã¤ã«ã ããèªã¿è¾¼ã¿ããã¨ãã¯ã以ä¸ã®ããã«ããã¸ã§ã¯ãç´ä¸ããå®è¡ãããã¨ãæ³å®ãã¦ã«ã¬ã³ããã£ã¬ã¯ããªãæå®ããã®ããããããã¿ã¼ã³ããªã¨æãã¾ãã
node --experimental-permission --allow-fs-read=$(PWD) index.js
--allow-fs-write ã«ãããã¡ã¤ã«æ¸ãè¾¼ã¿è¨±å¯
--experimental-permission ãä»ä¸ããã¨ããã¡ã¤ã«ã®èªã¿è¾¼ã¿ã ãã§ãªãæ¸ãè¾¼ã¿ãå¶éããã¾ãã
ããã«ããæªæã®ããã³ã¼ãã«ãããã¡ã¤ã«ã®æ¹ãããé²ããã¨ãã§ãã¾ãã
ããããç¹å®ã®ãã¡ã¤ã«ã«å¯¾ãã¦ãã¡ã¤ã«ã®æ¸ãè¾¼ã¿ã許å¯ãããå ´åãããã¨æãã¾ãã
ãã®å ´åã--allow-fs-write ã¨ãããã©ã°ãå©ç¨ãããã¨ã§ç¹å®ã®ãã¡ã¤ã«ã¸ã®æ¸ãè¾¼ã¿ã許å¯ã§ãã¾ãã
ãã¨ãã°ã次ã®ããã¹ããã¡ã¤ã«ãæ¸ãè¾¼ãããã°ã©ã ããã£ãã¨ãã¾ãã
const fs = require("node:fs"); const path = require("node:path"); fs.writeFileSync("/path/to/test.txt", "Hello");
ããã --experimental-permission ãªãã§å®è¡ããã¨ã/path/to/test.txt ã¨ãããã¡ã¤ã«ã« Hello ã¨æ¸ãè¾¼ã¾ãã¾ãã
ãããã--experimental-permission ãä»ä¸ãã¦å®è¡ããã¨ã¨ã©ã¼ã«ãªããã¡ã¤ã«ã®æ¸ãè¾¼ã¿ã¯ããã¾ããã
ããã§æ¬¡ã®ããã« --allow-fs-write ãã©ã°ãæå®ã㦠/path/to/allowed ãã£ã¬ã¯ããªé
ä¸ã®ãã¡ã¤ã«ã¸ã®æ¸ãè¾¼ã¿ãå¯è½ã«ãªãã¾ãã
$ node --experimental-permission --allow-fs-read=* --allow-fs-write=/path/to/allowed index.js
è¤æ°æå®ããå ´åã¯ã,ã§åºåã£ã¦æå®ãã¾ãã
$ node --experimental-permission --allow-fs-read=* --allow-fs-write=/path/to/allowed,/home index.js
--allow-fs-writeã--allow-fs-readã¨åæ§ã«æå®ãããã£ã¬ã¯ããªã®ãã¡ã¤ã«ã®ã¿ã許å¯ããããã以å¤ã®ãã¡ã¤ã«ã¸ã®æ¸ãè¾¼ã¿ã¯è¨±å¯ããã¾ããã
fs.writeFileSync("/path/to/allowed/test.txt", "Hello"); // OK fs.writeFileSync("/path/to/allowed/sub/test.txt", "Hello"); // ãµããã£ã¬ã¯ããªã¯OK fs.writeFileSync("/path/to/forbidden/test.txt", "Hello"); // å¥ãã£ã¬ã¯ããªã¯NG fs.writeFileSync("/path/to/test.txt", "Hello"); // 親ãã£ã¬ã¯ããªãNG
--allow-fs-readåæ§ããã¹ã¦ã®ãã¡ã¤ã«èªã¿è¾¼ã¿ã許å¯ãããã¨ã㯠--allow-fs-write=* ãæå®ãã¾ãã
$ node --experimental-permission --allow-fs-read=* --allow-fs-write=* index.js
ãã¡ãã macOS ã® zsh ã使ã£ã¦ããå ´å㯠--allow-fs-write=* ã§ã¯ãªãã--allow-fs-write=\* ã¨ããªããã°ãããªãç¹ã«æ³¨æãã¦ãã ããã
--allow-child-process ã«ãã child_process ã®è¨±å¯
Node.js ããããã»ã¹ãèµ·åããã¨ãã«ä½¿ããã child_process ãå©ç¨ãããã¨ã㯠--allow-child-process ãã©ã°ãä»ä¸ãã¾ãã
ãã¨ãã°ã次ã®ãããªãã¡ã¤ã«ããã£ãã¨ãã¾ãã
const { spawn } = require("node:child_process"); const ls = spawn("ls", ["-lh", "."]); ls.stdout.on("data", (data) => { console.log(`stdout: ${data}`); });
ããã --experimental-permission ãä»ä¸ãã¦å®è¡ããã¨ã¨ã©ã¼ãçºçããspawnã¯å®è¡ããã¾ããã
$ node --experimental-permission --allow-fs-read=* index.js
node:internal/child_process:395
const err = this._handle.spawn(options);
^
Error: Access to this API has been restricted
at ChildProcess.spawn (node:internal/child_process:395:28)
at spawn (node:child_process:757:9)
at Object.<anonymous> (/path/to/index.js:2:12)
at Module._compile (node:internal/modules/cjs/loader:1267:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1321:10)
at Module.load (node:internal/modules/cjs/loader:1125:32)
at Module._load (node:internal/modules/cjs/loader:965:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:83:12)
at node:internal/main/run_main_module:23:47 {
code: 'ERR_ACCESS_DENIED',
permission: 'ChildProcess',
resource: ''
}
ã¨ã©ã¼ã¡ãã»ã¼ã¸ãè¯ãè¦ãã¨ãpermission: 'ChildProcess' ã¨è¨è¼ããã¦ãã¾ãï¼ä¸ãã 2 ã¤ç®ã®é
ç®ï¼ã
ãã®ã¨ã©ã¼ãåºãã¨ãã¯æ¬¡ã®ããã« --allow-child-process ãä»ããªãã¨å®è¡ã¯æåãã¾ããã
$ node --experimental-permission --allow-fs-read=* --allow-child-process index.js
--allow-worker ã«ãã Worker Threads ã®è¨±å¯
worker_threads ã使ã£ã¦ãã«ãã¹ã¬ãããå©ç¨ãããå ´åã--allow-worker ãã©ã°ãä»ä¸ããªããã°ããã¾ããã
ãã¨ãã°ã次ã®ãããªããã°ã©ã ããã£ãã¨ãã¾ãã
const { Worker } = require("worker_threads"); const worker = new Worker("./worker.js");
ããã --allow-workerãä»ããã«å®è¡ããã¨æ¬¡ã®ãããªã¨ã©ã¼ãçºçãã¾ãã
$ node --experimental-permission --allow-fs-read=* index.js
node:internal/worker:211
this[kHandle] = new WorkerImpl(url,
^
Error: Access to this API has been restricted
at new Worker (node:internal/worker:211:21)
at Object.<anonymous> (/path/to/index.js:2:16)
at Module._compile (node:internal/modules/cjs/loader:1267:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1321:10)
at Module.load (node:internal/modules/cjs/loader:1125:32)
at Module._load (node:internal/modules/cjs/loader:965:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:83:12)
at node:internal/main/run_main_module:23:47 {
code: 'ERR_ACCESS_DENIED',
permission: 'WorkerThreads',
resource: ''
}
次ã®ããã«--allow-workerãã©ã°ãä»ä¸ãã¦å®è¡ãã㨠Woker ã®ããã°ã©ã ã¯å®è¡ããã¾ãã
$ node --experimenta-permission --allow-fs-read=* --allow-worker index.js
Permission Model ãã®åèè¨äº
以ä¸ã®è¨äºã§ã¯ Process-based Permissions ã ãã§ãªããModule-based Permissions ã«ã¤ãã¦ã解説ããã¦ãã¾ãããã¡ããä½µãã¦ãèªã¿ãã ããã
V8 11.3 ã«ããæ°ãã JavaScript ã®æ©è½
JavaScript ã¨ã³ã¸ã³ã§ãã V8 ã 11.3 ã«ã¢ãããã¼ããã¾ããã
ããã«ããæ°ãã JavaScript ã®æ©è½ã追å ããã¦ãã¾ãã
ããããã®æ©è½ã«ã¤ãã¦ã¯æ¬¡ã®è¨äºã詳ããã®ã§ããã¡ãããèªã¿ãã ããã
ãã¹ãã©ã³ãã¼ï¼node:testï¼ã stable ã«ææ ¼
Node.js æ¬ä½ã«çµã¿è¾¼ã¾ãã¦ãããã¹ãã©ã³ãã¼ã§ãã node:test ã stable ã«ãªãã¾ããã
Node.js ã®ãã¹ãã©ã³ãã¼ã§ãã node:test 㯠Jest ã Vitest ãªã©ã®ãã¹ãã©ã³ãã¼ã¨åããããªã¤ã³ã¿ã¼ãã§ã¤ã¹ãæã¤ãã¹ãã©ã³ãã¼ã§ããNode.js æ¬ä½ã«çµã¿è¾¼ã¾ãã¦ãããããJest ã Vitest ãªã©ãå¥éã¤ã³ã¹ãã¼ã«ãããã¨ãªããã¹ãã³ã¼ããå®è¡ãããã¨ãã§ãã¾ãã詳ããã¯ããã¥ã¡ã³ãããèªã¿ãã ããã
Node.js ã®ãã¹ãã©ã³ãã¼ï¼node:testï¼èªä½ã¯ Node.js v18 ããå®é¨çãªï¼experimentalï¼æ©è½ã¨ãã¦å®è£
ããã¦ãã¾ããã
Node.js v18 ã§å®è£ ããã¦ããå¤ãã®æ©è½è¿½å ãããã¾ããã以ä¸ã¯ãã®ä¸ä¾ã§ãã
describebefore,beforeEach,after,afterEach- Mock
mock.fn,t.mock.method,mock.resetãªã© - ã«ãã¬ãã¸
ããããstable åã¸ã®è¦æãå¤ããã¨ã大ããªåé¡ããªããã¨ãã Node.js v20 ãã stable ã«ãªãã¾ããã
ãã ããã«ãã¬ãã¸ã¬ãã¼ãã®å徿©è½ã¯ã¾ã experimental ãªããã-experimental-test-coverageãã©ã°ãå¿
è¦ã§ãã
Single Executable Application JSON ã® config ã使ã£ã Blob ãå¿ è¦ã«ãªã£ã
Single Executable Application ï¼ä»¥ä¸ SEAï¼ã¯ Node.js ã§å®è¡å¯è½ãª JavaScript ãåä¸ã®å®è¡ãã¡ã¤ã«ã«ããæ©è½ã§ãã
ã¾ã å®é¨çãªï¼experimentalï¼æ©è½ã§ãããNode.js v18.16.0 ããå©ç¨å¯è½ã§ãã
Node.js v20 ããã¯ãã®å®è¡ãã¡ã¤ã«ã®ãã¤ããªçææ¹æ³ãå¤ããã¾ããã
ãã£ããè¨ãã¨ãJavaScript ã³ã¼ãã Blob ã«å¤æããNode.js æ¬ä½ã®ãã¤ããªã«å¯¾ã㦠Blob ãæ¿å
¥ãã¦ï¼ã¤ã®ãã¤ããªã«ãã¾ãã
Single Executable Application ã«ããå®è¡ãã¡ã¤ã«ã®ãã¤ããªçææé
å®è¡ãã¡ã¤ã«ãçæããæ¹æ³ã¯ä¸è¨ã®ãªã³ã¯å ã® API ããã¥ã¡ã³ãã«ãè¨è¼ããã¦ãã¾ãããç°¡åã«èª¬æãã¾ãã
1. Node.js ã§å®è¡å¯è½ãª JavaScript ãã¡ã¤ã«ãç¨æãã
console.log(`Hello, ${process.argv[2]}!`);
2. å®è¡ãã¡ã¤ã«ã«æ¿å ¥ãã Blob ãã¡ã¤ã«ãçæããããã® config ãã¡ã¤ã«ã® JSON ãç¨æãã
{ "main": "hello.js", "output": "sea-prep.blob" }
mainã«ã¯ 1 ã§ç¨æãã JavaScript ãã¡ã¤ã«ã®ãã¹ãè¨è¼ãããoutputã¯åºåããã Blob ã®ãã¡ã¤ã«åãæå®ãããä½ã§ãè¯ãã
3. Blob ãçæãã
$ node --experimental-sea-config sea-config.json
ãã®ã³ãã³ããæåããã¨sea-preb.blobã¨ããååã®ãã¡ã¤ã«ãçæãããã¯ãã§ãã
4. Node.js ã®å®è¡ãã¡ã¤ã«ãã³ãã¼ãã
$ cp $(command -v node) hello
command -v nodeã§ Node.js ã®å®è¡ãã¡ã¤ã«ã®ãããã¹ãåå¾ãã¦ãã¾ãã/path/to/nodeã«å®æ
ãããã®ã§ããã°ã$(command -v node)ã®é¨åã/path/to/nodeã¨ãã¦ãåãå
容ã«ãªãã¾ãã
$(command -v node)ã®é¨å㯠Node.js ã®å®è¡ãã¡ã¤ã«ã§ãããã¨ã«æ³¨æãã¦ãã ãããnodenv ãªã©ã使ã£ã¦ããå ´å㯠Node.js ã®å®è¡ãã¡ã¤ã«ã§ã¯ãªããå®è¡ãã¡ã¤ã«ãå©ã shell ã¹ã¯ãªããã«ãªã£ã¦ããããã¾ãã
ããã¾ã§ããã¨helloã¨ããååã® Node.js æ¬ä½ã®å®è¡ãã¡ã¤ã«ãã³ãã¼ããã¾ãã
5. ã³ãã¼ãã Node.js ã®å®è¡ãã¡ã¤ã«ããç½²åãåé¤ãã
macOS ã®å ´åã
$ codesign --remove-signature hello
Windows ã®å ´åã
$ signtool remove /s hello
6. postject ã使ã£ã¦ã³ãã¼ãã Node.js ã®å®è¡ãã¡ã¤ã«ã« Blob ãæ¿å ¥ãã
postject ã¨ãããã¼ã«ã使ã£ã¦ã³ãã¼ãã Node.js ã®å®è¡ãã¡ã¤ã«ã« Blob ãæ¿å ¥ãã¾ãã
$ npx postject hello NODE_SEA_BLOB sea-prep.blob \
--sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2 \
--macho-segment-name NODE_SEA
postject ã Node.js ã®ãã¼ã ã«ãã£ã¦ã¡ã³ãããã¦ãã¾ãã
7. Node.js ã®å®è¡ãã¡ã¤ã«ï¼ã³ãã¼ï¼ã«åç½²åããã
macOS ã®å ´åã
$ codesign --sign - hello
Windows ã®å ´åã
$ signtool sign /fd SHA256 hello
8. ãã¤ããªãå®è¡ãã
ãã¤ããªã«å¼æ°ï¼World!ï¼ã渡ãã¦å®è¡ãã¦ã¿ãã¨æ¬¡ã®ãããªçµæã«ãªãã¾ãã
$ ./hello World! Hello, World!
ESM Loaders API ã® Worker å ã§ã®å®è¡
ESM ã® Loadeers API ãããããä½ãã¨ããã®ã¯æ¬¡ã®è¨äºå ã§è¨åãã¦ããã®ã§ããã¡ãããèªã¿ãã ããã
ãã£ããè¨ãã¨ãESM ã®ä»æ§ã«æ²¿ã£ã¦ããªãã¢ã¸ã¥ã¼ã«ã®èªã¿è¾¼ã¿ã®ããã« Custom Loader 颿°ãå®ç¾©ãã¦ãããå®è¡æã« Loader 颿°ã®ãã¡ã¤ã«ãæå®ãããã¨ã§ ESM ã®ä»æ§ã«ãªãã¢ã¸ã¥ã¼ã«èªã¿è¾¼ã¿ãå¯è½ã«ãªãã¨ãããã®ã§ãã
ãã¨ãã°ã次㮠Custom Loader ç¨ã®ãã¡ã¤ã«ã¯ CSS ã ESM ã§èªã¿è¾¼ãããã®ãã®ã§ãã
/* loader.mjs */ import { URL } from "url"; import { readFile } from "fs/promises"; /** * This function loads the content of files ending with ".css" to an ECMAScript Module * so the default export is a string containing the CSS stylesheet. */ export async function load(url, context, defaultLoad) { if (url.endsWith(".css")) { const content = await readFile(new URL(url)); return { format: "module", source: `export default ${JSON.stringify(content.toString())};`, }; } return defaultLoad(url, context, defaultLoad); }
ãã®ãã¡ã¤ã«ãç¨ããã¨æ¬¡ã®ããã« CSS ãèªã¿è¾¼ããã¨ãã§ãã¾ãã
import styles from "./styles.css" assert { type: "css" };
Custom Loader ãå©ç¨ããå ´åã¯--experimental-loaderãã©ã°ãå¿
è¦ã§ãã
$ node --experimental-loader=./loader.mjs index.mjs
Node.js v20 ãã㯠Custom Loader ç¨ã®ãã¡ã¤ã«ï¼ä¸è¨ã® loader.mjsï¼ã Worker ã§å®è¡ãããããã«ãªãã¾ãã
ããã«ãããã¢ããªã±ã¼ã·ã§ã³å´ã®å®è¡ã³ã³ããã¹ããåãããã¨ãã§ãã¾ããã¾ããWorker ã§åãããã°ãã¼ãã«å¤æ°ãå
±æãããªããªãã®ã§ãã¡ã¤ã³ã¹ã¬ããã¨ã®ããã¨ã㯠globalPreload ãçµç±ããªãã¨ãããªããªãã¾ãã
ã¾ããimport.meta.resolve()ãåæå®è¡ã«å¤ããã¾ãã
Ada 2.0 ã«ãã URL ãã¼ãµã¼ã®é«éå
Node.js v19.7.0 ãã Node.js å é¨ã® URL ãã¼ãµã¼ã Ada ã«ç§»è¡ããã¾ããã
twitter.comNode.js is moving to a new, faster URL parser called Ada. Check out more information in their initial release notes at https://t.co/QISZ0Ujm4i
— Node.js (@nodejs) 2023å¹´2æ6æ¥
Ada 㯠C++ã§å®è£ ããã¦ãããWHATWG ã® URL Standard ã® URL Parsing ã®ä»æ§ã«æ²¿ã£ã¦ãã¾ãã
ãã® Ada ã 2.0 ã«ãªã£ããã¨ã§é«éåããã¾ããã
次ã®è¨äºå ã«ããã¨ã100,000 åã® URL ãå©ç¨ãã¦ãã³ãã¼ãã¼ã¯ãè¨æ¸¬ããã¨ããã Ada ãå©ç¨ãã Node.js ã¯Deno ãã 3 åãBun ãã 82%ãé«éã¨ããçµæã«ãªã£ãã¨ã®ãã¨ã§ãã
Web Crypto API ã WebIDL ã«åããã¦äºææ§æ¹å
WebCrypto API 㯠JavaScript ã§æå·åã復å·ãç½²åããã®æ¤è¨¼çã®å¦çãè¡ããã¨ãã§ãã Web æ¨æºã® API ã§ããWeb æ¨æºã®ãããã©ã¦ã¶ã§ã Node.js ã§ãåãããã«ä½¿ããã¨ãã§ãã¾ãã
Node.js v15 ã« experimental ãªæ©è½ã¨ãã¦å®è£ ãããNode.js v19 ã§ stable ã«ææ ¼ãã¾ããã
ãã® Web Crypto API ã®äºææ§ã®æ¹åãããã¾ããã Web Crypto API ã®é¢æ°ã«å¼æ°ã«æ£ããåã®ãã¼ã¿ã渡ããªãã¨ã¨ã©ã¼ã«ãªãã¾ãã ã¾ããã¨ã©ã¼ã³ã¼ãã夿´ã«ãªã£ãã¨ã®ãã¨ã§ãã
ãã¨ãã°ã以ä¸ã®ãããªã³ã¼ãã¯ç¬¬ï¼å¼æ°ã ArrayBufferãBufferãTypedArrayãDataViewãæå¾
ãã¦ãããããã¨ã©ã¼ã«ãªãã¾ãã
await crypto.subtle.digest("sha-256", []);
ãã®ä»ã®ä»æ§ã«ã¤ãã¦ã¯ API ããã¥ã¡ã³ãããèªã¿ãã ããã
Deprecation and Removals
url.parse()ã«æ¸¡ããã¼ãã«æ°å¤ä»¥å¤ã渡ã㨠Deprecation è¦å
url.parse()ã«æ°å¤ä»¥å¤ã渡ããã¨ã¯ãã§ã«ããã¥ã¡ã³ãä¸ã§ã¯ Deprecate ã«ãªã£ã¦ãã¾ããã
ããããNode.js v20 ããã¯å®è¡æã«è¦åã表示ãããããã«ãªãã¾ãã
ã¾ã åé¤ã¯ããã¦ããªãã®ã§ãããåé¤ãããæ¥ãè¿ãããããã¾ããã®ã§ãããè¦åãåºãå ´åã¯ç´ã¡ã«ä¿®æ£ãã¦ãã ããã
ãã®ä»ã®å¤æ´
ARM64 ãªããã»ããµä¸ã§åã Windows ãå
¬å¼ã«ãµãã¼ããããããçè
ã¯ãã¾ãç¥ããªãã®ã§ããnew WASI()ããã¨ãã®å¼æ°ã®versionãå¿
é ã«ãªã£ããããããã§ãã
ã¾ã¨ã
Node.js ããã¼ã¸ã§ã³ã 20 ã«ãªãã¾ãããNode.js v20 ã¯ãã¼ã¸ã§ã³ãå¶æ°ãªã®ã§ 10 æé ã« LTS ã«ãªãäºå®ã§ãããã®è¨äºã®å·çæç¹ã§ã¯ 2023 å¹´ 10 æ 24 æ¥ã« LTS ã«ãªãäºå®ã§ãã
æ¥ç¨ã«ã¤ãã¦ã®ææ°ã®æ
å ±ã¯ä»¥ä¸ã®ãªãã¸ããªãã確èªãã ããã
Node.js ã«ã Deno ã®ãã㪠Permission Model ãå®è£
ããã¾ããããããããã©ã«ãã§æå¹ã«ãªãã®ã¯ã¾ã å
ãããããã¾ããããããªã大ããªå¤æ´ã§ãã
Deno ã npm package ã使ããããã«ãªã£ãããä»å¾ããäºãã®æ©è½ãå©ç¹ãå®è£
ãã¦ãã¦æ©è½å·®ãå°ãªããªã£ã¦ããã®ã§ããããã
Single Executable Application 㯠vercel/pkg ãç½®ãæããããããã¾ããã
C ã Rust ã§ä½ã£ãå®è¡ãã¡ã¤ã«ã«æ¯ã¹ãã¨ãNode.js æ¬ä½ã®å®è¡ãã¡ã¤ã«ãå¿
è¦ãªããå®è¡ãã¡ã¤ã«ã®ãµã¤ãºã大ãããªãããããã¾ããããJavaScript ã使ãéçºè
ã§ãåä¸ã®å®è¡ãã¡ã¤ã«ã Node.js ãã¤ã³ã¹ãã¼ã«ãã¦ããªãã¦ã¼ã¶ã¼ã«ãé
å¸ã§ããããã«ãªãã®ã¯è¯ãã¨æãã¾ãã
ã¾ããAda ã«ãã URL ãã¼ãµã¼ã®é«éåããããããã§ãããåèè¨äºå ã®ãã³ããã¼ã¯ãã©ãã¾ã§ä¿¡ãã¦ãããã¯ãããã¾ããããããªãé«éåããã¦ããã®ã¯å¬ããã§ãã
é·ããªã£ã¦ãã¾ãã¾ããããæå¾ã¾ã§ãèªã¿ããã ããããã¨ããããã¾ãããä¸åã質åããããã¾ãããã@shisama_ã¾ã§ã¡ã³ã·ã§ã³ããããã³ã¡ãªã©ã§ã³ã¡ã³ããã ããã