Накопительный пакет не создает исходную карту машинописного текста

Я использую свертку с svelte + typescript + 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,
    },
}

Я не уверен, что именно делаю не так. Вот ссылка на код, который я использую. Любая помощь будет глубоко оценена!


person dasfdsa    schedule 02.08.2020    source источник
comment
Я только что клонировал ваш проект, запустил npm run build и отлично сгенерировал исходную карту машинописного текста. Он выводит bundle.js.map. Какая команда, которую вы запускаете, вызывает у вас проблемы?   -  person Carlos Roso    schedule 03.08.2020
comment
@CarlosRoso Зарегистрируйте что-нибудь на консоли Chrome в файле TS и щелкните номер строки, чтобы проверить, видите ли вы файл TS в инспекторе Chrome. (Я описал свою проблему здесь: github.com/sveltejs/template/issues/157)   -  person dasfdsa    schedule 03.08.2020


Ответы (4)


Вот что сработало для меня: вам нужно установить sourceMap: false в параметрах подключаемого модуля typescript rollup.

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

Оказывается, коллапсер исходной карты свертки конфликтует с генератором исходной карты плагина машинописного текста. Вот почему он работает в сборках prod, но не работает в сборках dev (потому что изначально это sourceMap: !production). Просто позвольте свертке делать тяжелую работу.

person Carlos Roso    schedule 03.08.2020

Как также упоминалось другими, похоже, что комбинация TypeScript и Rollup приводит к проблеме. Отключение исходной карты в TypeScript только решает проблему сопоставления Svelte с TypeScript. Однако вы получаете карту исходного кода, показывающую источник только в скомпилированном JavaScript, а не в исходном TypeScript. Наконец-то я нашел решение, которое сработало для меня: просто добавьте Option inlineSources: true к параметрам TypeScript:

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

Это обходит проблему, просто не создавая дубликат SourceMap, а копируя исходный код из TypeScript в SourceMap.

person freytag    schedule 03.08.2020
comment
Я пробовал это, но я все еще просто получаю исходные карты для скомпилированного JavaScript (лучше, чем ничего), но не отображаю исходный TypeScript. Имеет ли значение минификатор? Я говорю лаконично, а не стройно. - person kshetline; 30.06.2021

Для тех, кто использует лаконичность, а не стройность, это решило ту же проблему для меня:

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.

person kshetline    schedule 30.06.2021

Что касается меня, я могу составить карту, сделав 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  }),
  ]
}
person Haryono    schedule 09.07.2021