feat(esm): 按目录加载脚本、打包与热更新
把一个目录当脚本仓库:按路径寻址、esbuild 打包、内容变了自动重编。
- Loader 扫目录建索引,Load(name) 给出打好包的源码和版本号
- bundler esbuild 的封装。ESM 格式而不是 IIFE——IIFE 会附带一整套
CommonJS interop helper,每建一个 VM 都要重跑一遍
- plugin 把扩展的 TS 模块变成可以 import 的虚拟模块,磁盘上没有文件
- typings 把这些虚拟模块的类型按 node_modules 布局落盘,编辑器才认识
esbuild 原生实现了 Node 的模块解析,所以脚本能直接 import node_modules
里的第三方库。写出来的类型文件是 index.ts 而不是 index.d.ts:扩展给的是
真正的模块源码,里面可能带实现,声明文件里不允许有实现。
node_modules 不参与热更新的版本计算——依赖包是装出来的,改动总伴随显式的
安装动作,而真实的 npm 包动辄上千个文件,每次取脚本 stat 一遍太贵。
This commit is contained in:
+15
@@ -0,0 +1,15 @@
|
||||
export default class AsyncController {
|
||||
Sync(): string { return "同步结果" }
|
||||
|
||||
async Async(): Promise<string> { return "异步结果" }
|
||||
|
||||
async AwaitSomething(): Promise<string> {
|
||||
const v = await Promise.resolve("await 的结果")
|
||||
return v
|
||||
}
|
||||
|
||||
async Fails(): Promise<string> { throw new Error("异步失败") }
|
||||
|
||||
// 永远不会 resolve —— goja 没有事件循环,没人能让它完成
|
||||
Never(): Promise<string> { return new Promise(function () {}) }
|
||||
}
|
||||
Reference in New Issue
Block a user