ãªã ES2022 ã§æååãªãã©ã«ã使ã£ã import/export ãã§ããããã«ãªãã®ã
Published on
11 æ 11 æ¥ã«ã以åããä¸é¨ã§æ³¨ç®ããã¦ãããã Pull Request ã tc39/ecma262 ã«ãã¼ã¸ããã¾ããã
ãã® Pull Request ããã¼ã¸ããããã¨ã§ãèå¥åã§ã¯ãªãæååãªãã©ã«ã使ã£ã import/export ãå¯è½ã«ãªãã¾ããã
ãã®ä»æ§å¤æ´ã¯ãããã¼ã¶ã«ã¨ããå½¢ã§æ±ããã¦ã¯ãã¾ããããæ§æä¸ã®å½±é¿ãããã®ã§ãJavaScript ã¦ã¼ã¶ã¼ã¨ãã¦ç¥ã£ã¦ããã«è¶ãããã¨ã¯ãªããã®ã«ãªãã¾ãã
æ¦è¦
ã¾ãå ·ä½ä¾ã示ãã¾ãã
ä»åã®å¤æ´ã«ãã£ã¦ã次ã®ããã« import/export ããéã®ååã¨ãã¦æååãªãã©ã«ã使ããããã«ãªãã¾ãã
const foo = "foo";
export { foo as "ð hey hey" };
import { "ð hey hey" as foo } from "./module.js";
console.log(foo); // foo
åºæ¬çã«ã¯ããã ãã§ãã
詳解
ããããã¯ä»æ§ä¸ã®ç¨èªã使ã£ã¦è§£èª¬ããã¾ãã
ãã®å¤æ´ãå
¥ãåã® ECMAScript ã§ã¯ ImportSpecifier
㧠as
ã使ãå ´å as
ã®å·¦å´ã¯ IdentifierName
ã§ãªããã°ããã¾ããã§ããã
ã¾ã ExportSpecifier
ã¯ãåä¸ã® IdentifierName
ãããã¯ãas
ã使ãå ´å㯠as
ã®å·¦å´ã¨å³å´ã¯ä¸¡æ¹ã¨ã IdentifierName
ã§ãªããã°ããã¾ããã§ããã
ä»åã®å¤æ´ã«ãã£ã¦ãæ°ãã« ModuleExportName
ã¨ããæ§æã追å ããã¾ãããModuleExportName
ã¯ãIdentifierName
ããã㯠StringLiteral
ã®å½¢ãã¨ãã¾ãã
ãã¨ãã°ãèå¥å foo
ã æååãªãã©ã« "ð hey hey"
㯠ModuleExportName
ã§ãã
ããã¦ãImportSpecifier
㧠as
ã使ãå ´å as
ã®å·¦å´ã¯ ModuleExportName
ã®å½¢ãã¨ãããã«ãªãã¾ããããããã£ã¦ã次ã®ä¾ã® import
æã¯ãã¹ã¦æ§æã¨ãã¦å¦¥å½ã§ãã
import { foo } from "mod";
import { foo as bar } from "mod";
import { "ð hey hey" as baz } from "mod";
ExportSpecifier
ã¯ãåä¸ã® ModuleExportName
ãããã¯ã as
ã使ãå ´å as
ã®å·¦å´ã¨å³å´ã¯ä¸¡æ¹ã¨ã ModuleExportName
ã®å½¢ãã¨ãããã«ãªãã¾ããããããã£ã¦ã次ã®ä¾ã® export
æã¯ãã¹ã¦æ§æã¨ãã¦å¦¥å½ã§ãã
export { foo } from "mod";
export { "ð hey hey" } from "mod";
export { foo as foo } from "mod";
export { foo as "ð hey hey" } from "mod";
export { "ð hey hey" as foo } from "mod";
export { "ð hey hey" as "ð hey hey" } from "mod";
ãã ã ExportSpecifier
ã® ModuleExportName
ã StringLiteral
ã«ã§ããã®ã¯ããã® ExportSpecifier
ãå«ã ExportDeclaration
ã« FromClause
ãåå¨ããå ´åã®ã¿ã§ãã
ãã¨ãã°ã次ã®ã³ã¼ã㯠ExportDeclaration
ã« FromClause
ãåå¨ããªãã®ã§ ExportSpecifier
㧠StringLiteral
ã使ããã¨ã¯ã§ãã¾ããã
// ã§ããªã
export { "ð hey hey" };
ä¸æ¹ã§ã次ã®ã³ã¼ã㯠FromClause
ãåå¨ããã®ã§ãExportSpecifier
㧠StringLiteral
ã使ããã¨ãã§ãã¾ãã
// ã§ãã
export { "ð hey hey" } from "mod";
æååã®å¶ç´
StringLiteral
ã¯é常㮠JavaScript ã®æååãªãã©ã«ã§ãããã¨ãã° "foo"
ã¨ã "bar"
ã¿ãããªå½¢ããããã®ã§ãã
ModuleExportName
㯠StringLiteral
ãå«ãã®ã§ãå
¨ã¦ã®æååãªãã©ã«ã ModuleExportName
ã¨ãã¦ä½¿ããããã«ã¿ãã¾ãããå®éã«ã¯å°ã
ç°ãªãã¾ããModuleExportName
ã¨ãã¦ä½¿ãã StringLiteral
ã«ã¯å¶éãããã¾ãã
ModuleExportName
ã¨ãã¦ä½¿ãã StringLiteral
ã¯ãWell-Formed Code Unit Sequence ã§ãªããã°ããã¾ããã
ãã®ãã¨ã¯ãModule Semantics ã® Eary Errros å
ã® https://tc39.es/ecma262/#_ref_6583 ã«è¨è¼ããã¦ãã¾ãã
Well-Formed Code Unit Sequence ã¨ã¯
JavaScript ã®æåå㯠UTF-16 ã§ã¨ã³ã³ã¼ãããã¾ãããã®ãããå®éã«ã¯ JavaScript ã®æååã¨ããã®ã¯ 16 ãããã®æ´æ°ã§è¡¨ç¾ããã Unicode ã®ã³ã¼ãã¦ãããã®ä¸¦ã³ã§ããããã¾ããã
UTF-16 ã§ã¯åºæ¬çã« 1 æåã«ã¤ã 16 ãããã§è¡¨ç¾ããã¾ããããããUnicode ã® BMP(åºæ¬å¤è¨èªé¢)ã«åã¾ããªãæå㯠16 ãããã®ã³ã¼ãã¦ããããäºã¤ä¸¦ã¹ããã¢ã§è¡¨ç¾ãã¾ãã
ãã¨ãã°ãã²ãããªã® ã
㯠BMP ã«å«ã¾ãã¦ãããä¸ã¤ã®ã³ã¼ãã¦ããã(0x3042
)ã§è¡¨ããã¾ãã
console.log("\u3042"); // ã
ä¸æ¹ã§ãð ®
(å±
ã§ã¯ãªããã¨ã«æ³¨æ) 㯠BMP ã«å«ã¾ããªãã®ã§ãäºã¤ã®ã³ã¼ãã¦ããã(0xD842
㨠0xDF9F
)ã§è¡¨ããã¾ãããã®ãããªã³ã¼ãã¦ãããã®ãã¢ãããµãã²ã¼ããã¢ã¨ããã¾ãã
console.log("\uD842\uDF9F"); // ð ®
åè¿°ã®ã¨ãããJavaScript ã®æåå㯠16 ãããã®æ´æ°ã§è¡¨ç¾ãããã³ã¼ãã¦ãããã®ä¸¦ã³ã§ããããã¾ããããããã£ã¦ãð ®
ãæ§æããäºã¤ã®ã³ã¼ãã¦ãããã§ãã 0xD842
㨠0xDF9F
ã®ãã¡ä¸ã¤ã ããå«ãæååãä½ããã¨ãã§ãã¾ãã
const str = "\uD842";
ãããã0xD842
åä½ã«å¯¾å¿ããæå㯠Unicode ã«ã¯åå¨ãã¾ããã
ãã®ãããªã対ã«ãªã£ã¦ããªããµãã²ã¼ããã¢ãå«ããããªæåå㯠Well-Formed Code Unit Sequence ã§ã¯ããã¾ããã
éã«ã対ã«ãªã£ã¦ããªããµãã²ã¼ããã¢ã許容ããªããããªæååã Well-Formed Code Unit Sequence ã¨ããã¾ããã¤ã¾ãã大éæã«ããã°ãã¡ããã¨æåã«ãªã£ã¦ããã³ã¼ãã¦ãããã§æ§æãããæååãã¨ãããã¨ã§ãã
ã¡ãªã¿ã«ããã®ãã㪠Well-Formed ãªæåå㯠WebIDL ã§ã¯ USVString ã¨å¼ã°ãã¦ãã¾ãã
æ°ãã Abstract Operation IsStringWellFormedUnicode
ãã®ä»æ§ã®å¤æ´ã«ä¼´ã£ã¦ãIsStringWellFormedUnicode
ã¨ããæ°ãã Abstract Operation ã追å ããã¾ããã
ãã® Abstract Operation ã¯ãå¼æ°ã®æååã Well-Formed Code Unit Sequence ãã©ãããå¤å®ãã¾ãã
åè¿°ãã ModuleExportName
ã®ããã® Early Errors ã§ã¯ããã® IsStringWellFormedUnicode
Abstract Operation ã使ã£ã¦ StringLiteral
ã Well-Formed Code Unit Sequence ãã©ããã®å¤å®ãè¡ãã¾ããããã¦ãã Well-Formed Code Unit Sequence ã§ãªããã° Syntax Error ã«ãªãã¾ãã
ä»æ§å¤æ´ã®ã¢ããã¼ã·ã§ã³
å®ã¯ãã®ä»æ§ã®å¤æ´ã¯ãä»ã® Web ã®ä»æ§ã§ã¯ã»ã¨ãã©å½¹ã«ç«ã¤ãã¨ã¯ããã¾ããã
ãã®å¤æ´ãè¡ãããã¢ããã¼ã·ã§ã³ã¯ãå°æ¥çã« WebAssembly ã® Module ã¨ã®ç¸äºéç¨æ§ãåä¸ãããããã§ãã
ãã®èæ¯ãç解ããããã«ããããã¦ããã¹ãåæãäºã¤ããã¾ãã
ï¼ã¤ç®ã¯ãWebAssembly ã® Module ã§ã¯é¢æ°ã export ããã¨ãã«æååã§ååãã¤ããã¨ãããã¨ã§ãã
ãã¨ãã°æ¬¡ã®ä¾ã§ã¯ $add
ã¨ããé¢æ°ã "add"
ã¨ããåå㧠export ãã¦ãã¾ãã
(module
(func $add (param $lhs i32) (param $rhs i32) (result i32)
local.get $lhs
local.get $rhs
i32.add)
(export "add" (func $add))
)
ï¼ã¤ç®ã¯ãWebAssembly ã® Module ã JavaScript ãã import ã§ããããã«ããããã¨ããåããããã¨ãããã¨ã§ããWebAsembly/esm-integration ãªã©ã§ããã®åããè¦ããã¨ãã§ãã¾ãã
ç°¡åã«ããã°ã次ã®ããã«ãã¦ç°¡åã« WebAssembly ã® Module ã JavaScript ããæ±ããããã«ãããã¨ãããã¨ã§ãã
import { add } from "foo.wasm";
console.log(add(1, 2)); // 3
ç¾å¨ã® WebAssembly ããã³ ECMAScript ã®ä»æ§ã§ã¯ããã®ãããªå½¢ã§ JavaScript å´ãã WebAssembly ã® Module ãèªã¿è¾¼ããã¨ã¯ã§ãã¾ããã
ããããåæã¨ãã¦ä¸ã§ã次ã®ä¾ã«ã¤ãã¦èãã¾ãã
ãã®ä¾ã¯åè¿°ãããã®ã¨ã»ã¨ãã©å¤ããã¾ããããexport
ã®å¾ãã "add"
ã§ã¯ãªã "+"
ã«ãªã£ã¦ãã¾ããexport
ã®å¾ãã«ã¯æååãç½®ããã¨ãã§ããã®ã§ãããã¯å¦¥å½ãª Module ã§ãã
(module
(func $add (param $lhs i32) (param $rhs i32) (result i32)
local.get $lhs
local.get $rhs
i32.add)
(export "+" (func $add))
)
å°æ¥ãWebAssembly ã® Module ã JavaScript ãã import ã§ããããã«ãªã£ãã¨ãã«ããã®ã¢ã¸ã¥ã¼ã«ãã +
é¢æ°ã named import ãããã¨ãã¾ãã
ãããã+
㯠IdentifierName
ã§ã¯ãªãã®ã§ãä»ã¾ã§ã® ECMAScript ã®ä»æ§ã§ã¯ named import ã§ãã¾ããã§ããã
// ã§ããªã
import { + } from "foo.wasm";
// ã§ããªã
import { + as add } from "foo.wasm";
ä»åã®å¤æ´ã«ãã£ã¦ ImportSpecifier
ã® as
ã®å·¦å´ã« StringLiteral
ãç½®ããããã«ãªã£ããã¨ã§ã次ã®ããã«æ¸ãããã«ãªãã¾ããã
// ES2022 ã§ã§ãã
import { "+" as add } from "foo.wasm";
console.log(add(1, 2)); // 3
ãã®ãããªæ¸ãæ¹ã¯ ES2022 ã§ã¯æ§æä¸ã¯å¦¥å½ã§ãããå®éã«ã¯ã¾ã WebAssembly ã® import ã¯ã§ãã¾ããã
ã¾ããModuleExportName
ã® StringLiteral
ã Well-Formed Code Unit Sequence ã§ãªããã°ãªããªãã¨ããå¶ç´ãåå¨ããã®ããWebAssembly ã¨ã®ç¸äºéç¨ã®ããã§ãã
WebAssembly ã®ããã¹ããã©ã¼ããã㧠export
ã®å¾ã«ç¶ãæåå㯠Well-Formed Code Unit Sequence ã§ãªããã°ãããªãã®ã§ãããã¨çµ±ä¸ãããã®ã§ãããã
åèãªã³ã¯
- TC39
- Babel
- MDN
- ECMA262
- Unicode
- WebAssembly
è¨äºã«é¢ããå ±åãªã©ã¯ãã¡ããã