簡體   English   中英

如何在開發模式下減少 webpack bundle?

[英]How to reduce webpack bundle in development mode?

我正在嘗試為 react/redux 項目創建我自己的 webpack 配置。 配置似乎運行得很好,但是包的大小很大(在開發模式下,我知道如何在生產模式下減少它)

我的package.json看起來像

  "dependencies": {
    "react": "15.4.2",
    "react-dom": "15.4.2",
    "react-hot-loader": "3.0.0-beta.6"
  },
  "devDependencies": {
    "babel-core": "6.24.0",
    "babel-loader": "6.4.1",
    "babel-preset-react": "6.23.0",
    "commitizen": "2.9.6",
    "cz-conventional-changelog": "2.0.0",
    "html-webpack-plugin": "2.28.0",
    "webpack": "2.3.1",
    "webpack-bundle-analyzer": "^2.3.1",
    "webpack-dev-server": "2.4.2"
  }

我的 webpack 配置看起來像

const webpack = require('webpack');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const HtmlWebpackPlugin = require('html-webpack-plugin');

const project = require('./project.config')

const __DEV__ = project.globals.__DEV__;
const __PROD__ = project.globals.__PROD__;
const __TEST__ = project.globals.__TEST__;

const APP_ENTRIES = [project.paths.client('index.js')];

if (__DEV__) {
  APP_ENTRIES.unshift(
    'react-hot-loader/patch',
    `webpack-dev-server/client?http://${project.server_host}:${project.server_port}`,
    'webpack/hot/only-dev-server'
  )
}

const config = {
  devtool: project.compiler_devtool,

  entry: APP_ENTRIES,

  output: {
    path: project.paths.dist(),
    filename: `[name].[${project.compiler_hash_type}].js`,
    publicPath: project.compiler_public_path,
  },

  resolve: {
    modules: [
      project.paths.client(),
      'node_modules',
    ],
  },

  module: {
    rules: [{
      test: /\.js?$/,
      loader: 'babel-loader',
      exclude: /node_modules/,
    }],
  },

  plugins: [
    new BundleAnalyzerPlugin(),
    new HtmlWebpackPlugin({
      template: project.paths.client('index.html'),
      hash: false,
      filename: 'index.html',
      inject: 'body',
    }),
  ],

  node: {
    fs: 'empty',
    net: 'empty',
    tls: 'empty'
  }
}

if (__DEV__) {
  config.plugins.push(
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NoEmitOnErrorsPlugin());
}

module.exports = config

現在我在運行webpack-dev-server時得到了這個輸出

Webpack-dev-server 輸出

如您所見,我的包大於 1.3 Mb,但我只使用了幾個庫。

我試圖使用webpack-bundle-analyser找出為什么我的包這么大。 這是結果

Webpack-bundle-分析器結果

似乎reactreadct-dom是最大的庫。

有沒有辦法在開發模式下減少我的包的大小??? 我做錯什么了嗎 ?

PS:我在webpack-dev-server選項中設置了compress = true ,但它並沒有減少包的大小。


這里有更多關於我如何使用webpack-dev-server細節

bin/start.js (我使用node bin/start.js運行它)

const webpack = require('webpack');
const WebpackDevServer = require('webpack-dev-server');

const config = require('../config/webpack.config');
const project = require('../config/project.config');

function runDevServer() {
  const devServer = new WebpackDevServer(webpack(config), {
    compress: true,
    hot: true,
    publicPath: project.compiler_public_path,
    stats: project.compiler_stats,
    watchOptions: {
      ignored: /node_modules/
    },
  });

  // Launch WebpackDevServer.
  devServer.listen(project.server_port, project.server_host, (err) => {
    if (err) {
      console.log('Webpack dev server encountered an error', err);
      return reject(err);
    }
    console.log(`Listening at ${project.server_host}:${project.server_port}`);
  });
}

runDevServer()

src/index.js (我的應用程序。 Home只是一個返回“Hello world”的組件)

import React from 'react';
import ReactDOM from 'react-dom';

import { AppContainer } from 'react-hot-loader';

import Home from './routes';

const render = () => {
  try {
    ReactDOM.render(
      <AppContainer>
        <Home />
      </AppContainer>,
      document.getElementById('root')
    );
  } catch (err) {
    console.error(err)
  }
};

if (module.hot) {
  module.hot.accept('./routes', () => render());
}

render()

在開發期間有一個大包是正常的,1.3MB 仍然很小,通常應該可以快速加載。 由於您使用的是 webpack-dev-server,因此每次更改后都不需要重新加載。 如果你使用compress = true ,你的包大小將是相同的,除了當客戶端要求它時它會被 gzip 壓縮(你應該在網絡選項卡中看到 gzip)。 我建議您不要嘗試減小開發包的大小,因為它很難調試且刷新速度較慢。 如果您真的想減小大小,則可以僅對庫代碼進行丑化和縮小。 這是一種非常常見的方法,您基本上將每個庫都放在一個名為vendor.js的文件中,您將對其進行縮小、丑化等。在另一個文件bundle.js您將擁有您編寫的所有代碼。 這將顯着減少總大小。 但您必須加載 2 個 js 文件。 還積極您可以將樹的WebPack 2.搖晃她是有關更多信息樹搖晃 您可以參考這個關於如何單獨捆綁供應商腳本的答案,並在此處閱讀有關代碼拆分的更多信息。 但是請記住,您的開發包將始終具有更大的尺寸,因為它在調試時非常方便。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM