## Named Imports from CJS via Property Delegation ```js import {readFile} from "fs"; ``` * Not in the cards * Codegen order of operations issue * Deopts ala `with` for all imports even ESM<->ESM * Causes Temporal Dead Zone (TDZ) for any non-default CJS import ## Async Loader * Web-like * Browsers preserve order of evaluation but do not guarantee sync SourceTextModuleRecord ModuleEvaluation * Browsers fetch/parse async prior to starting any ESM graph loading * Allows for gaps in evaluation phase / top level await * Would be a standard synchronization system for Web and Node both * Works on existing spec w/o changes * Avoids a TDZ in circular deps ``` a (CJS) -> b b (ESM) -> a ``` If `b` is async (wrapped in a Promise) `a` cannot access the shape of `b` including any dynamic shaping of `a`. This is important if a loader wants to be able to have CJS able create it's shape at runtime (a route for limited named imports from CJS). If this was sync CJS would have to *always* unconditionally have an exact shape of `{default}` to avoid TDZ issues. No solution exists for a loader to mutate the shape afterwards. If async, a loader could produce a MITM ESM *in theory* that has the ability to have named imports w/o a TDZ. Such a MITM ESM would require usage of setter functions to update the live bindings and would not be for the faint of heart unfortunately, but possible even w/o Proxies. ## Sync Loader * CJS-like * Node has always sync loading mandate for CJS * Babel-like* * `require("esm")` only has minor changes from Babel@6. * does not have same mutation qualities of Babel Modules (BM) * variables are always live unlike BM * Needs https://github.com/caridy/proposal-dynamic-modules to introduce lazy/late linking * Introduces a linking TDZ in loader * See example about TDZ in circular deps for some context * `import {non_existant} from "CJS";` would throw at ModuleEvaluation not ModuleDeclarationInstanciation. Which leads to partial graph eval due to linking error (not possible in current spec).