Slide 1

Slide 1 text

Module Harmony Yosuke Furukawa 2024-05-31 @ CTO ڠձ LT ۝ஈԼ

Slide 2

Slide 2 text

એ఻

Slide 3

Slide 3 text

WebϑϩϯτΤϯυ൛ DX Criteria ࡞Γ·ͨ͠ Ξηεϝϯτγʔτग़ͨͷͰੋඇ΍ͬͯΈͯԼ͍͞

Slide 4

Slide 4 text

X: @yosuke_furukawa GitHub: yosuke-furukawa

Slide 5

Slide 5 text

Module Harmony ͱ͍͏ఏҊ͕ߦΘΕ͍ͯΔ

Slide 6

Slide 6 text

JavaScript (ECMAScript) ͸߹੍ٞ Proposal ͱ͍͏ఏҊΛग़ͯ͠࿩͠߹ͬͯ ࣮૷ͯ͠ΈͯҙݟΛग़͠߹͍ͳ͕Β৽͍͠࢓༷͕ܾ·Δ

Slide 7

Slide 7 text

ͦΜͳதɺ Module ͸ ༷ʑͳఏҊ͕ߦΘΕͯ͠·͍ͬͯΔ

Slide 8

Slide 8 text

৽͍͠ఏҊͱ͍͏Θ͚Ͱ͸ͳ͍ɻ ͲͪΒ͔ͱ͍͏ͱ "੔ཧ" ͱ͍͏ͷʹ͍ۙɻ

Slide 9

Slide 9 text

Module Harmony ͷ໨త • ϓϩϙʔβϧΛԣஅͨٞ͠࿦ • ൚༻తͳϞδϡʔϧۭؒʹؔ͢Δٞ࿦ • ԣஅͨ͠ݒ೦΋͘͠͸ݸผͷϓϩϙʔβϧʹؔ͢Δٙ໰ͷ໌֬Խ • ͭ·Γɺ৭ʑ͋ΔϓϩϙʔβϧΛΫϦΞʹͯ͠ɺٞ࿦͠·͠ΐ͏ͱ ͍͏࿩

Slide 10

Slide 10 text

͡Ό͋ࠓͲΜ͚ͩͷ Proposal ͕ Module ʹ͋Δͷ͔ʁ

Slide 11

Slide 11 text

͜Μ͚ͩ͋Δ • Import attributes • Module Expressions • Module Declarations • Module local imports • Module Source imports • Module Instance imports • Deferred import evaluation • Module loader hooks • Module source static analysis • Virtual Module sources

Slide 12

Slide 12 text

͜Μͳʹ͋ͬͨΒ༁Θ͔ΒΜ͘ͳΒͳ͍ʁ

Slide 13

Slide 13 text

Θ͚Θ͔ΒΜ͘ͳͬͯΔ Module Source Module Instance Module loader hooks Source import instance import Module Expressions Module Declarations imports from local bindings Module Source Static Analysis Virtual module sources Deferred import Import attributes ґଘؔ܎໼ҹͷઌ͕ґଘઌ

Slide 14

Slide 14 text

Θ͚Θ͔ΒΜ͘ͳͬͯΔ Module Source Module Instance Module loader hooks Source import instance import Module Expressions Module Declarations imports from local bindings Module Source Static Analysis Virtual module sources Deferred import Import attributes ґଘؔ܎໼ҹͷઌ͕ґଘઌ ґଘͳ͠ɺಠཱͯ͠ਐΊΒΕΔ ඃґଘڧ͠ɻ ૣ͘ίϯηϓτΛܾΊͳ͍ͱ ଞͷ΍ͭਐΊΒΕͳ͍ɻ

Slide 15

Slide 15 text

Θ͚Θ͔ΒΜ͘ͳͬͯΔ Module Source Module Instance Module loader hooks Source import instance import Module Expressions Module Declarations imports from local bindings Module Source Static Analysis Virtual module sources Deferred import Import attributes ґଘؔ܎໼ҹͷઌ͕ґଘઌ ࢓༷ͱܾͯ͠·Δ·Ͱԕͦ͏ɻ ૬ޓґଘͯ͠Δɾɾɾ

Slide 16

Slide 16 text

͔ͩΒɺ "੔ཧ" ͠Α͏Ͷ͍ͬͯ͏࿩

Slide 17

Slide 17 text

ࠓճ͸ͦΕͧΕΛ঺հͯ͠ɺ ʮ΁ʔʯͬͯͳͬͨΒऴྃ

Slide 18

Slide 18 text

ͱΓ͋͑ͣɺҰ൪ґଘ͕ͳ͍ͱ͜Ζ͔Β

Slide 19

Slide 19 text

import attributes • ੲ import assertions ͬͯݴΘΕͯͨ΍ͭ • import ͢ΔࡍʹͲΜͳܗࣜͷ΋ͷΛimport͢Δͷ͔એݴͰ͖Δ • JSONΛimport͢Δ࣌ʹ࢖͏ͷ͕ݱࡏͷओͳϢʔεέʔε • ͦͷ͏ͪଞͷ΋ͷ΋ࢦఆͰ͖ΔΑ͏ʹ͢Δ͔΋ɻ import foo from "./bar.json" with { type: "json" }; import ("./baz.json", { with: { type: "json" } })

Slide 20

Slide 20 text

Deferred import evaluation • import ࣌ʹ஗ԆධՁͰ͖Δ syntax Λ௥Ճ͢Δ࢓༷ • await import() Ͱ΋஗Ԇ͸Ͱ͖Δ͕ɺasync function͕ڧ੍͞Εͯ͠ ·͏ɻ import defer * as ns from "./mod.mjs"; function later() { ns.anExport; // ࣮ߦ࣌ʹ mod.mjs ΛධՁ͢Δ }

Slide 21

Slide 21 text

ܹ͘͠ґଘ͞ΕͯΔ΍ͭ

Slide 22

Slide 22 text

Import Phase ͷ͓͞Β͍

Slide 23

Slide 23 text

Import Phase ͷ͓͞Β͍ ͦΕͧΕ͝ͱʹम০ࢠΛ༻ҙ͍ͯ͠Δ

Slide 24

Slide 24 text

Module Source ͱ͍͏֓೦ • ϑΝΠϧΛιʔε͔Βimportͨ͠ΒίϯύΠϧ΋͢Δɻ • WebAssembly.instatiateStreamingΛ࢖ΘͣʹϩʔυͰ͖Δ import source x from ""; // wasm ͰϞδϡʔϧΛϩʔυ͢Δͱ͔͕۩ମྫ import source foo from "./foo.wasm";

Slide 25

Slide 25 text

Module Source Phase Import • JS Ͱ΋ source Λ࢖ͬͯ import ͢Δɻ import source foo from "./foo.mjs"; // ͜ͷ࣌఺Ͱ͸ foo ͸ϑΝΠϧͱಉ͡Α͏ͳ֓೦ // worker ͱͯ͠ಡΈࠐ·ͤΔͱ͔Ͱ͖ΔΑ͏ʹ͍ͨ͠ɻ const fooWorker = new Worker(fooModule, { type: "module" });

Slide 26

Slide 26 text

Module Instance ͱ͍͏֓೦ • Module ͷΠϯελϯεΛϩʔυͯ͘͠Δ • ͦ΋ͦ΋ module Λ୯ମͰࣜͱͯ͠ධՁ͠ɺఆٛ͠ɺinstanceΛimportͰ͖ΔΑ͏ʹ͢Δɻͱ ͍͏௕͍ಓͷΓɻ •

Slide 27

Slide 27 text

Module Declaration • module Λ import / export ͠ͳͯ͘΋ϑΝΠϧ಺෦ͰఆٛͰ͖ΔΑ ͏ʹͨ͠΋ͷɻ • bundlerͱ͔Ͱͦͷ··moduleΛ࣋ͬͯ͜ΕΔΑ͏ʹɻ module Foo { let i = 0; export function foo() { console.log("foo"); return i++; } }

Slide 28

Slide 28 text

Module Expression • declareͨ͠moduleΛࣜͱͯ͠ධՁͰ͖Δɻ const fooModule = module { self.addEventListener("message", (e) => {}); }; const fooWorker = new Worker(fooModule, { type: "module" });

Slide 29

Slide 29 text

Module Expression • import จ΋ॻ͚Δɻ let mod = module { import { count } from "./db.js"; export let x = 2 * count(); };

Slide 30

Slide 30 text

Module Instance Imports • ͦ͏΍ͬͯఆٛͨ͠ Module ͷ Instance ͚ͩ Import ͢ΔͨΊͷ import จ import module foo from "./foo.js";

Slide 31

Slide 31 text

Module Instance Imports (local bindings) • ࣗ෼ͷϑΝΠϧ಺Ͱఆٛͨ͠΋ͷ͸ local Ͱ import Ͱ͖ΔΑ͏ʹ͢ Δɻ module foo {}; module bar { import foo from foo; // ͜ͷ࣌ʹࣝผࢠ͸จࣈྻ͡Όͳͯ͘΋͍ ͍ɺม਺ͷΑ͏ʹbinding͞Εͨ΋ͷ͕࢖͑Δ

Slide 32

Slide 32 text

Module loader hooks • source level ͰಡΜͩ module Λϩʔυ͢Δ࣌ʹݕ஌ͯ͠ͻͱखؒ Ճ͑ͯ͘ΕΔ΍ͭɻ • Moduleͱͯ͠ context ΛՃ͑ΔࡍʹͳΜ͔৽͍ؔ͠਺௥Ճͨ͠Γͱ ϝλϓϩάϥϛϯάͰ࢖͏ import source foo from "foo.js"; new Module(source, { importHook(speci f ier) { // ... }, });

Slide 33

Slide 33 text

࣮૷·Ͱԕͦ͏ͳ΍ͭ

Slide 34

Slide 34 text

Module Static Analysis • Module ͷ source Λղੳͨ͠ஈ֊Ͱ import / export ͷґଘάϥϑ Λ࡞ΔͨΊͷ৘ใΛఏڙ͢ΔϓϩύςΟ { import : "a", from: "a.js"} { import : "b", as: "c" from: "b.js"} ...

Slide 35

Slide 35 text

Virtual Module Source • Ծ૝ͷ Module Source Λ࡞ΕΔ࢓༷ • new Module Ͱ৽͍͠ModuleΛ࡞ΔࡍʹݩͱͳΔίʔυ͕ͳͯ͘΋object ͔ΒԾ૝ϞδϡʔϧΛ࡞ΕΔ class FooModuleSource { bindings = { // ͜͜ʹ static analysis ͞ΕΔbindingsͷ৘ใ͕དྷΔ }; constructor(text) { this.#object = JSON.parse(text); }; execute(imports) { imports.default = clone(this.#object); }; } const source = new FooModuleSource(); const module = new Module(source);

Slide 36

Slide 36 text

ͳͲɺ৭ʑ͋Δɻɹ

Slide 37

Slide 37 text

Module Harmonyʹ͍ͭͯ • ͨ͘͞Μग़ͯ͠·ͬͨ module ͷ࢓༷ΛҰ୴੔ཧ͠Α͏ͥͱ͍͏ࢼ Έ • ࣮͸ੲ΋ಉ͡Α͏ͳ͜ͱ͕͋ͬͨɻ • ͦΕ͕ ES4 ͷ൵ܶͱ harmony ͱ͍͏ࢪࡦ

Slide 38

Slide 38 text

Module Harmonyʹ͍ͭͯ • ࢓༷ΛܾΊΔதͰ΋৭ʑ͋Δɻ • OSS͸৭ʑΩϥΩϥ͍ͯ͠Δ͔ΒɺಌΕΔͷ΋Θ͔Δ͕ɺ࣮͸த͸ ͜͏͍͏࣮ࣾձͰ΋͋Γͦ͏ͳ࿩͹͔Γɻ • ͔ͩΒͦ͜ɺීஈ͔Β৺͕͚Δඞཁ͕͋Δɻ • ҰൠͷΞϓϦέʔγϣϯͷ։ൃ׆ಈͰ΋ harmony Λॏࢹ͍͖ͯ͠ ͍ͨɻ

Slide 39

Slide 39 text

ࢀߟจݙ • https://docs.google.com/presentation/d/ 1mZrAHHimtM_z_8fM9L3DUXFz5bjlJPxx8VrwsC68hmk/ edit#slide=id.g1918a5fc7ef_1_97 • https://github.com/tc39/proposal-compartments/blob/master/2- virtual-module-source.md • https://github.com/tc39/proposal-module-declarations/ • https://zenn.dev/pixiv/articles/c7071eb29927fe