@build-script/typescript-transformer-dual-package
v2.0.4
Published
A TypeScript transformer for (mainly) use with ttypescript that will (semi-)auto create dual package hazard.
Downloads
13
Maintainers
Readme
这是个啥子哦
这是一个ttypescript插件:
- 在 tsc 正常编译文件后,重新编译它,用于生成 commonjs 格式的文件(以
.cjs
结尾)。 - 在每个顶级
import
语句的路径中添加.js
(暂不支持修改动态 import 语句) - 在 commonjs 格式的文件中,将
import.meta.url
转换成"file://" + __filename
使用方法
- 安装
typescript
和ttypescript
,以及这个包npm install --save-dev typescript ttypescript @build-script/typescript-transformer-dual-package
- 在你的
tsconfig.json
中插入一段:{ "compilerOptions": { "module": "esnext", // 必须,可以是老版本(比如es6),但不能是commonjs、systemjs等非ESM目标 // ... 其他选项 "plugins": [ { "transform": " @build-script/typescript-transformer-dual-package", "compilerOptions": { // [可选] // 通常都不需要设置这个,可用于在第二次编译时覆盖父级compilerOptions // 部分选项设置了也无效(例如module) }, "verbose": false // 可以设置成true或1 !输出爆炸警告! } ] } }
- 写 TS 的大部分过程都不变,但是需要注意:
- 别在你自己的代码里用任何一个
require
!,用await import()
代替。(使用module::createRequire
API 的情况除外) - 不要在 import 的路径后面加
\.(c|m)?js
这样的扩展名(比如import "./some-file.js"
)
- 别在你自己的代码里用任何一个
- 建议:
- 打开
allowSyntheticDefaultImports
和esModuleInterop
两个选项(在 tsconfig.json 里)
- 打开
- 编译时用
ttsc
而不是tsc
(webpack 等打包工具均支持 ttypescript,具体看他们的文档)npm install ttypescript ttsc -p path/to/tsconfig.json
- 在你的
package.json
里这样写:{ "type": "module", "main": "lib/api.cjs", // "browser": "lib/api.cjs", "module": "lib/api.js", // "esnext": "lib/api.js", "bin": { "some-cli-command": "lib/bin.cjs" }, "exports": { ".": { "require": "lib/api.cjs", "import": "lib/api.js" }, "some-path.js": { "require": "lib/some-path.cjs", "import": "lib/some-path.js" } } }
- 如果你的包含有命令行入口(没有就没事了)并且它不是 tsc 编译的输出
- 将其扩展名改成
.cjs
- 将其扩展名改成
相关信息:
- TypeScript 的转换器:
- 如果某一天 typescript 原生支持 tsconfig 里的 plugins,到时候
ttypescript
就不需要了 - Typescript 编译器文档
- ttypescript
- 如果某一天 typescript 原生支持 tsconfig 里的 plugins,到时候
- 关于扩展名:
- Typescript 未来可能直接支持输出不同扩展名的文件,到时候这个包就没用了(可以用两次编译代替)
- 最初的思路来自:Zoltu/typescript-transformer-append-js-extension
- Node.JS:
- 关于 package.json 中
exports
字段的文档:Conditional Exports
- 关于 package.json 中
基本原理
tsc
/ttsc
启动- 它根据 tsconfig 加载这个包
- 创建
Program
对象,初始化包括这个包在内的 transformer - 这个包内复制一个 Program 对象,用于之后编译 cjs。这次的 module 设置为 commonjs,并且添加了一个“内部 transformer”
- 当
Program
的emit
被调用(被 webpack、tsc),对每个被编译的文件:- 修改文件中的
ImportDeclaration
和ExportDeclaration
,给他们添加.js
扩展名 - 调用之前复制的
Program
的emit
,它会重新编译一次,在此过程中“内部 transformer”生效- 修改文件中的
ImportDeclaration
和ExportDeclaration
,给他们添加.cjs
扩展名,并将import.meta.url
替换
- 修改文件中的
- 修改文件中的