使用typescript開發node專案時,為了提高開發體驗,經常會配置paths對映模組路徑
{
...
"baseUrl": ".",
"paths": {
"@core": ["src/core"],
"@interfaces": ["src/interfaces"],
"@decorators": ["src/decorators"],
"@constants": ["src/constants"],
"@common": ["src/common"],
"@services": ["src/services"],
"@utils": ["src/utils"]
}
}
複製程式碼
在使用中就可以直接引入相應的模組,十分方便
方便歸方便,但是ts只是做了一層對映關係,在編譯階段沒有將程式碼替換,編譯後的js程式碼中依然會存在
在啟動時會丟擲如下異常
can not find XXX module
複製程式碼
由於改變編譯後的js程式碼會導致sourceMap會失效,但是經過除錯發現只要不改變行數,sourceMap依然會能獲取正確的程式碼位置,所以我打算在tsc編譯後,通過掃輸出目錄,再根據對映關係,替換其中字元, 這樣即能正確執行,又能正確的deubg。
使用commander製作命令列工具
思路比較簡單,先通過tsc編譯原始碼,然後再通過fs操作編譯後的檔案替換相應的字元
// 定義了三個引數
program
.version(packAge.version)
// 編譯的目標目錄
.command("build <projectPath>")
.description("transform tsconfig.json paths")
// 檢視日誌
.option("-d, --debug")
// 指定tsconfig.json檔案路徑
.option("-t, --tsconfigName [tsconfigName]")
.action((projectPath, opt) => {
// 具體操作
});
複製程式碼
// 第一步: 將tsconfig.json檔案輸出稱json資料
let compilerOptions = await filesToJson<ICompilerOptions>(tsconfigPath, [
"compilerOptions"
]);
// 第二步: 編譯操作
await this._buildTsc(tsconfigPath);
// 第三步: 替換編譯後資料夾中的相應字元
await this._transformPaths(
join(tsconfigDir, targetRootDir),
join(tsconfigDir, outDir),
pathsConfig
);
複製程式碼
最後,提交npm包,之後在專案中就可以愉快的玩耍了
yarn add --dev ts-paths
npx ts-paths build ./ -t tsconfig.json -d
複製程式碼
專案地址: https://github.com/soraping/ts-paths