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

标签 express rollupjs

我正在做一件相当奇怪的事情,我在每个请求上都直接编译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/

相关文章:

node.js - 基于 Content-Type header 的 Expressjs 路由器

javascript - Vue JS 应用程序上的 Passport JS 身份验证

node.js - 有没有办法让 Express 从两个文件系统目录中提取一个 Web 目录?

asp.net - 分布式软件架构中的捆绑优化

angular2-routing - 使用 AOT 和 Rollup 的 Angular 2 子模块路由

node.js - 如何在node js中访问另一个文件中的变量

javascript - Angular +图像上传。将表单数据传输到后端时遇到问题

babeljs - 更改 Babel 插件解析的目录?

typescript - src ➜ tsc ➜ rollup ➜ `source maps` 能否指向原来的TypeScript src?

javascript - Rollup,多个文件,多个文件中相同的常量名称: error in browser: Uncaught SyntaxError: Identifier 'o' has already been declared