接下来我们检查当导入来源不是 或 开头的就转换为 的形式:. / /@module/xxx
// app.js
const MagicString = require("magic-string");
app.use(async function (req, res) {
if (/\.js\??[^.]*$/.test(req.url)) {
// js
let js = fs.readFileSync(path.join(basePath, req.url), "utf-8");
await init;
let parseResult = parseEsModule(js);
let s = new MagicString(js);
//
parseResult[0].forEach((item) => {
//
if (item.n[0] !== "." && item.n[0] !== "/") {
s.overwrite(item.s, item.e, `/@module/${item.n}`);
}
});
res.setHeader("Content-Type", typeAlias.js);
res.statusCode = 200;
res.end(s.toString());
}
});
修改 字符串我们使用了 ,从这个简单的示例上你应该能发现它的魔法之处,就是js magic-string
即使字符串已经变了,但使用原始字符串计算出来的索引修改它也还是正确的,因为索引还是相
对于原始字符串。
可以看到 已经成功被修改成 了。vue /@module/vue
紧接着我们需要拦截一下 请求:/@module
// app.js
const { buildSync } = require("esbuild");
app.use(async function (req, res) {
if (/^\/@module\//.test(req.url)) {
// /@module
let pkg = req.url.slice(9);
// package.json
let pkgJson = JSON.parse(
fs.readFileSync(
path.join(basePath, "node_modules", pkg, "package.json"),
"utf8"