将Typescript绝对路径转换为nodejs相对路径



我正在将typescript编译为es5/commonjs格式。我正在使用typescript的tsconfig.json paths属性为`import语句指定一个固定的根。

例如,我可能有一个路径配置@example: './src/'

编译*.ts文件后,require语句将类似于:

require('@example/boo/foo');

我需要创建一个后处理脚本,该脚本考虑当前javascript文件的路径和导入路径。

因此,例如,如果更新了导入的javascript文件位于dist/foo/pitythefoo.js中,并且它从dist/boo/boo.js导入导出,则路径@example/boo/boo必须替换为../boo/boo

现在,如果pitythefoo.js位于dist(dist/pitythefoo.js(的根,则@example字符串将被./替换。

因此,基本算法似乎是:

如果文件位于dist的根目录,则用./替换@example。如果它更深,则计算深度,例如,如果它有两个目录深,则添加../..以向上移动到根目录,然后移动到导入模块资源所在的路径。听起来合理吗?

所以总的来说,我在想这样的事情:

globby('dist/**/*.js'). //get the paths of all the js files
then(process); //read each file as a text file and perform the string replacement
//Save the file using the original file name.

function process(path:string) {
const file = fs.readFileSync(path);
//update require statements contents of file
fs.writeFileSync(file,path);
}

有人知道一个实用程序,它可以分析导入路径长度和当前资源的路径,并为require()语句生成正确的相对路径吗?

这似乎是一种相当常见的模式,所以尽量避免重新发明轮子。。。

我已经为我的项目实现了一个解决这个问题的脚本。目标是能够使用非相对路径,这可以通过Typescriptspaths配置选项来实现,并使编译后的ES5/CommonJS输出使用相对路径,以便将包发布到NPM。上面的链接有github版本,这里是代码:

const fs = require("fs");
const globby = require("globby");
require("mkdirp").sync("dist");
require("cpy")("package.json", "dist");
const options = { overwrite: true };
const rc = require("recursive-copy");
rc("target/src/", "dist", options).then(() => {
globby("./dist/**/*.js")
.then(paths => {
paths.forEach(update);
})
.catch(e => console.log(e));
globby("./dist/**/*.d.ts")
.then(paths => {
paths.forEach(update);
})
.catch(e => console.log(e));
});
function update(path) {
count = (path.match(///g) || []).length;
let replacement = "";
if (count == 2) {
replacement = "./";
} else if (count > 2) {
const size = count - 2;
replacement = Array(size)
.fill("../")
.join("");
} else {
throw new Error("Invalid / count in path of file");
}
let js = fs.readFileSync(path, "utf8");
js = js.replace(/@fs//g, replacement);
fs.writeFileSync(path, js);
}

相关内容

  • 没有找到相关文章

最新更新