Размер пакета Webpack увеличивается при каждой последовательной сборке

#javascript #reactjs #webpack #sass

#javascript #reactjs #webpack #sass

Вопрос:

Я упаковываю проект с помощью webpack, чтобы использовать его в качестве библиотеки. Это библиотека компонентов, поэтому я создаю небольшие пакеты для каждого компонента, который находится в его собственном каталоге под src/ui . Это пример компонента:

 src/
 |- ui/
    |-- anchor/
        |- dist/
        |- index.js
        |- _anchor.scss

  

Я делаю вид, что генерирую связанный компонент в dist/index.js .

При моей текущей конфигурации Webpack, если я запускаю NODE_ENV=production webpack --display-modules , например, три раза подряд без изменения какого-либо кода, выходные данные Webpack будут:

                    Asset      Size  Chunks             Chunk Names
    anchor/dist/index.js  4.69 KiB       0  [emitted]  anchor
anchor/dist/index.js.map  15.8 KiB       0  [emitted]  anchor
Entrypoint anchor = anchor/dist/index.js anchor/dist/index.js.map
[0] external "react" 42 bytes {0} [built]
[1] external "classnames" 42 bytes {0} [built]
[2] ./src/ui/anchors/_anchor.scss 1.94 KiB {0} [built]
[3] ./node_modules/css-loader/dist/runtime/api.js 2.35 KiB {0} [built]
[4] ./src/ui/anchor/index.js   1 modules 1.69 KiB {0} [built]
    | ./src/ui/anchor/index.js 1.41 KiB [built]
    | ./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/defineProperty.js 269 bytes [built]
  
                    Asset      Size  Chunks             Chunk Names
    anchor/dist/index.js   5.7 KiB       0  [emitted]  anchor
anchor/dist/index.js.map  14.3 KiB       0  [emitted]  anchor
Entrypoint anchor = anchor/dist/index.js anchor/dist/index.js.map
[0] ./src/ui/anchor/dist/index.js 4.69 KiB {0} [built]
[1] external "react" 42 bytes {0} [built]
[2] external "classnames" 42 bytes {0} [built]
  
                    Asset      Size  Chunks             Chunk Names
    anchor/dist/index.js  6.71 KiB       0  [emitted]  anchor
anchor/dist/index.js.map  16.6 KiB       0  [emitted]  anchor
Entrypoint anchor = anchor/dist/index.js anchor/dist/index.js.map
[0] ./src/ui/anchor/dist/index.js 5.7 KiB {0} [built]
[1] external "react" 42 bytes {0} [built]
[2] external "classnames" 42 bytes {0} [built]
  

Как вы можете видеть, размер пакета увеличивается примерно на 1 КБ при каждом выполнении.

Моя текущая конфигурация webpack:

 const path = require('path')

module.exports = {
  mode: 'production',
  entry: {
    anchor: './src/ui/anchor'
  },
  output: {
    path: path.resolve(__dirname, 'src', 'ui'),
    filename: '[name]/dist/index.js',
    library: ['components', '[name]'],
    libraryTarget: 'umd'
  },
  externals: {
    react: 'umd react',
    'react-dom': 'umd react-dom',
    'prop-types': 'umd prop-types',
    classnames: 'umd classnames'
  },
  module: {
    rules: [
      {
        test: /.(js|jsx)$/,
        exclude: /(node_modules|dist)/,
        loader: 'babel-loader',
        options: {
          presets: [require.resolve('babel-preset-react-app')],
        },
        enforce: 'pre',
      }, {
        test: /.scss$/,
        use: [
          "css-loader",
          "sass-loader"
        ]
      }
    ]
  },
  devtool: 'source-map'
}
  

Как я могу настроить это так, чтобы пакет «сбрасывался» или оставался неизменным?

Ответ №1:

В library.filename вы настроили [name] параметр, указывающий, что для каждой настроенной вами записи будет присвоено специальное имя. Обычно этот параметр используется только в том случае, если вы используете несколько точек входа, которых я здесь не вижу.

Вам не придется ничего «сбрасывать» при перекомпиляции вашего Webpack. Я предполагаю, что размер файла не стал бесконечно больше после этого вопроса, верно?

Проверьте это: https://github.com/webpack/webpack/tree/master/examples/multi-part-library