汇总未生成打字稿源地图

时间:2020-08-02 16:07:20

标签: rollup

我正在使用svelte +打字稿+ scss进行汇总。我的问题是我无法生成源地图。

以下是我的汇总配置文件:

import svelte from 'rollup-plugin-svelte'
import resolve from '@rollup/plugin-node-resolve'
import commonjs from '@rollup/plugin-commonjs'
import livereload from 'rollup-plugin-livereload'
import { terser } from 'rollup-plugin-terser'
import typescript from '@rollup/plugin-typescript'
import alias from '@rollup/plugin-alias'

const production = !process.env.ROLLUP_WATCH
const path = require('path').resolve(__dirname, 'src')
const svelteOptions = require('./svelte.config')

function serve() {
    let server

    function toExit() {
        if (server) server.kill(0)
    }

    return {
        writeBundle() {
            if (server) return
            server = require('child_process').spawn(
                'yarn',
                ['run', 'start', '--', '--dev'],
                {
                    stdio: ['ignore', 'inherit', 'inherit'],
                    shell: true,
                }
            )

            process.on('SIGTERM', toExit)
            process.on('exit', toExit)
        },
    }
}

export default {
    input: 'src/main.ts',
    output: {
        sourcemap: true,
        format: 'iife',
        name: 'app',
        file: 'public/build/bundle.js',
    },
    plugins: [
        alias({
            entries: [
                { find: '@app', replacement: `${path}` },
                { find: '@components', replacement: `${path}/components` },
                { find: '@includes', replacement: `${path}/includes` },
                { find: '@styles', replacement: `${path}/styles` },
                { find: '@pages', replacement: `${path}/pages` },
            ],
        }),
        svelte(svelteOptions),

        // If you have external dependencies installed from
        // npm, you'll most likely need these plugins. In
        // some cases you'll need additional configuration -
        // consult the documentation for details:
        // https://github.com/rollup/plugins/tree/master/packages/commonjs
        resolve({
            browser: true,
            dedupe: ['svelte'],
        }),
        commonjs(),
        typescript({ sourceMap: !production }),

        // In dev mode, call `npm run start` once
        // the bundle has been generated
        !production && serve(),

        // Watch the `public` directory and refresh the
        // browser on changes when not in production
        !production && livereload('public'),

        // If we're building for production (npm run build
        // instead of npm run dev), minify
        production && terser(),
    ],
    watch: {
        clearScreen: false,
    },
}

我不确定我到底在做什么错。这是我正在使用的link编码。 任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:3)

正如其他人所提到的,似乎TypeScript和Rollup的组合导致了问题。在TypeScript中禁用源映射只能解决将Svelte映射到TypeScript的问题。但是,您只会收到已编译 JavaScript而不是原始TypeScript中显示源的源映射。我终于找到了一个对我有用的解决方案:只需将Option inlineSources: true添加到TypeScript选项中即可:

typescript({ sourceMap: !production, inlineSources: !production }),

这不是通过简单地不创建重复的SourceMap而是通过将源代码从TypeScript复制到SourceMap中来解决此问题。

答案 1 :(得分:2)

这对我有用:您需要在sourceMap: false汇总插件选项中设置typescript

export default {
  input: 'src/main.ts',
  output: {
    sourcemap: true,
    format: 'iife',
    ...
  },
  plugins: [
    ...
    svelte(...),
    typescript({ sourceMap: false }),
    ...
  ]
}

事实证明汇总的源地图折叠程序与打字稿的插件源地图生成器发生冲突。这就是为什么它在prod版本上有效而在dev版本上无效的原因(因为它最初是sourceMap: !production)。只是让汇总进行繁重的工作即可。

答案 2 :(得分:0)

对于任何使用 terser 而不是 svelte 的人来说,这为我解决了同样的问题:

import sourcemaps from 'rollup-plugin-sourcemaps';
import { terser } from 'rollup-plugin-terser';
import typescript from '@rollup/plugin-typescript';

export default [
  {
    input: 'dist/index.js',
    output: [
      {
        file: 'dist/cjs/index.js',
        format: 'cjs'
      },
      {
        file: 'dist/fesm2015/index.js',
        format: 'es'
      }
    ],
    plugins: [
      sourcemaps(),
      terser(),
      typescript({ sourceMap: true, inlineSources: true })
    ]
  }
];

显然需要 rollup-plugin-sourcemaps 来执行使用 TypeScript 编译器生成的地图文件并将它们提供给 terser 所需的魔法。

答案 3 :(得分:0)

对我来说,我可以通过制作 sourcemap: "inline"

进行映射

在/build/index.esm.js 文件里面会有映射。

export default {
  input: "src/index.ts",
  output: [
    {
      file: 'build/index.esm.js',
      format: 'es',
      sourcemap:  "inline"
    },
  ],
  plugins: [
    typescript({ sourceMap: false, inlineSources: true  }),
  ]
}