gpt4 book ai didi

express - 如何让 Rollup 的内联源映射发挥作用?

转载 作者:行者123 更新时间:2023-12-02 16:51:58 25 4
gpt4 key购买 nike

我正在做一件相当奇怪的事情,我在每个请求上都直接编译Javascript(请暂时假装这是一个合理的事情;不用说,它仅供内部开发使用) .

不幸的是,尽管我尝试了几种配置,但我无法使源映射工作。

我的快速路线如下:

app.get(`/js/${f.script}`, async (req, res) => {
try {
const bundle = await rollup.rollup({
input: `./examples/src/${f.script}`,
external: ['React', 'ReactDOM'],
treeshake: false,
plugins: [
resolvePlugin({ jsnext: true, extensions: ['.js', '.jsx'] }),
commonjsPlugin({ include: 'node_modules/**' }),
babelPlugin({
babelrc: false,
presets: [
[
'env',
{ modules: false, targets: { browsers: ['last 2 versions'] } },
],
'react',
],
plugins: ['external-helpers', 'transform-class-properties'],
exclude: 'node_modules/**',
}),
],
});

const { code, map } = await bundle.generate({
format: 'iife',
sourcemap: 'inline',
intro: `var process = {
env : {
NODE_ENV : 'development',
}
}`,
});

res.set('Content-Type', 'text/javascript');
res.send(
`${code}\n//@ sourceMappingURL=data:application/json;charset=utf-8,${map}`,
);
// eslint-disable-next-line no-console
console.log(`Served ${f.script}`);
} catch (e) {
// eslint-disable-next-line no-console
console.log('oh bad no no', e);
res.sendStatus(500);
}
});

这给我一个脚本,后面是:

//@ sourceMappingURL=data:application/json;charset=utf-8,{"version":3,"file":...

它很长,但在我相对未经训练的眼睛看来就像源图。浏览器完全忽略它。

我已经尝试过仅使用 sourcemap: 'inline' 而没有使用其他位,这不会在末尾附加任何源映射。我现在已经多次手动将生成的源映射“附加”到脚本末尾,但 Chrome 无法识别它。这里有一个简单的语法错误,还是我的整个方法错误?

最佳答案

你就快到了 - 你是对的,在使用 bundle.generate 时需要手动附加注释(如果你使用 bundle.write ,它会自动为你完成) code> 相反,但这在这里没有意义)。

很可能,JSON 导致数据 URI 无效,因此需要将其呈现为 base64。 map 对象附加了一个方法,可以让您轻松完成此操作:

res.send(
`${code}\n//# sourceMappingURL=${map.toUrl()}`,
);

toUrl的实现可见here

请注意,我使用 //# 而不是 //@ — 两者都有效,但 //# 是正式的“首选” ' (根据 spec//@ 是一个遗留工件)。

关于express - 如何让 Rollup 的内联源映射发挥作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48871386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com