【问题标题】:Webpack extreme slow buildWebpack 极慢构建
【发布时间】:2016-04-08 01:05:08
【问题描述】:

我使用 webpack + typescript + react

webpack.config.js 是:

var webpack = require('webpack');
var path = require('path');
var node_modules_dir = path.join(__dirname, 'node_modules');

var deps = [
  'react/react.js',
  'react-dom/react-dom.js',
];

var config = {
    devtool: 'source-map',
    context: __dirname + '/Scripts/ts',
    entry: {
        server: "./server.js",
        client: "./client.ts"
    },
    output: {
        path: path.resolve(__dirname, "Scripts/public/"),
        filename: '[name].bundle.js'
    },
    resolve: {
        alias: {},
        modulesDirectories: ["node_modules"],
        extensions: ['', '.webpack.js', '.web.js', '.ts', '.tsx', '.js']
    },
    module: {
        noParse: [],

        // Use the expose loader to expose the minified React JS
        // distribution. For example react-router requires this
        loaders: [ {
            test: /\.ts(x?)$/,
            exclude: /(node_modules|bower_components)/,
            loader: 'babel-loader?presets[]=es2015&presets[]=react!ts-loader'
        },
        {
            test: path.resolve(node_modules_dir, deps[0]),
            loader: "expose?React"
        },
        ]
    },
    watch: true
};

deps.forEach(function (dep) {
    var depPath = path.resolve(node_modules_dir, dep);
    config.resolve.alias[dep.split(path.sep)[0]] = depPath;
    config.module.noParse.push(depPath);
});

module.exports = config;

我的问题是构建速度。初始过程大约需要 25 秒和增量 - 5-6 秒。结果:

webpack --profile --display-modules

是:

ts-loader: Using typescript@1.8.0-dev.20160104 and C:\Users\rylkov.i\Documents\Visual Studio 2013\Projects\react_test_app\react_test_app\tsconfig.json
Hash: d6d85b30dfc16f19f4a6
Version: webpack 1.12.9
Time: 25547ms
               Asset     Size  Chunks             Chunk Names
    client.bundle.js  1.14 MB       0  [emitted]  client
    server.bundle.js  1.14 MB       1  [emitted]  server
client.bundle.js.map  1.31 MB       0  [emitted]  client
server.bundle.js.map  1.31 MB       1  [emitted]  server
   [0] ./client.ts 80 bytes {0} [built]
       factory:38ms building:21905ms dependencies:1ms = 21944ms
   [0] ./server.js 70 bytes {1} [built]
       factory:14ms building:19ms = 33ms
   [1] C:/Users/rylkov.i/Documents/Visual Studio 2013/Projects/react_test_app/react_test_app/~/expose-loader?Components!./components/index.js 179 bytes {0} {1} [built]
       [0] 33ms -> factory:2078ms building:8ms = 2119ms
   [2] C:/Users/rylkov.i/Documents/Visual Studio 2013/Projects/react_test_app/react_test_app/Scripts/ts/components/index.js 210 bytes {0} {1} [built]
       [0] 33ms -> [1] 2086ms -> factory:19832ms building:4ms = 21955ms
   [3] C:/Users/rylkov.i/Documents/Visual Studio 2013/Projects/react_test_app/react_test_app/Scripts/ts/components/main.tsx 4.78 kB {0} {1} [built]
       [0] 33ms -> [1] 2086ms -> [2] 19836ms -> factory:26ms building:331ms dependencies:1ms = 22313ms
   [4] C:/Users/rylkov.i/Documents/Visual Studio 2013/Projects/react_test_app/react_test_app/~/react/react.js 172 bytes {0} {1} [built]
       [0] 33ms -> [1] 2086ms -> [2] 19836ms -> [3] 357ms -> factory:315ms building:0ms = 22627ms
   [5] C:/Users/rylkov.i/Documents/Visual Studio 2013/Projects/react_test_app/react_test_app/~/react/react.js 641 kB {0} {1} [built]
       [0] 33ms -> [1] 2086ms -> [2] 19836ms -> [3] 357ms -> [4] 315ms -> factory:1ms building:86ms = 22714ms
   [6] C:/Users/rylkov.i/Documents/Visual Studio 2013/Projects/react_test_app/react_test_app/Scripts/ts/components/todoItem.tsx 2.81 kB {0} {1} [built]
       [0] 33ms -> [1] 2086ms -> [2] 19836ms -> factory:28ms building:576ms dependencies:70ms = 22629ms
   [7] C:/Users/rylkov.i/Documents/Visual Studio 2013/Projects/react_test_app/react_test_app/Scripts/ts/components/selectControl.tsx 3.44 kB {0} {1} [built]
       [0] 33ms -> [1] 2086ms -> [2] 19836ms -> factory:27ms building:428ms dependencies:218ms = 22628ms
   [8] C:/Users/rylkov.i/Documents/Visual Studio 2013/Projects/react_test_app/react_test_app/~/react-dom/react-dom.js 1.17 kB {0} {1} [built]
       [0] 33ms -> [1] 2086ms -> [2] 19836ms -> [7] 455ms -> factory:215ms building:4ms = 22629ms
   [9] C:/Users/rylkov.i/Documents/Visual Studio 2013/Projects/react_test_app/react_test_app/Scripts/ts/components/selectItem.tsx 2.63 kB {0} {1} [built]
       [0] 33ms -> [1] 2086ms -> [2] 19836ms -> factory:28ms building:502ms dependencies:144ms = 22629ms
  [10] C:/Users/rylkov.i/Documents/Visual Studio 2013/Projects/react_test_app/react_test_app/~/imports-loader?$=jquery!C:/Users/rylkov.i/Documents/Visual Studio 2013/Projects/react_test_app/react_test_app/Scripts/ui-select.js 99.6 kB {0} {1} [built]
       [0] 33ms -> [1] 2086ms -> [2] 19836ms -> [7] 455ms -> factory:150ms building:145ms = 22705ms
  [11] C:/Users/rylkov.i/Documents/Visual Studio 2013/Projects/react_test_app/react_test_app/~/jquery/dist/jquery.js 348 kB {0} {1} [built]
       [0] 33ms -> [1] 2086ms -> [2] 19836ms -> [7] 455ms -> [10] 295ms -> factory:10ms building:211ms = 22926ms

我认为这非常慢。 react.js 和 react-dom.js 已经是编译好的 js 文件,不需要额外的。我的组件只是示例。 webpack 的另一个问题是:

watch:true

配置属性。我不明白为什么总是有效。但也许这是因为构建过程缓慢。谢谢!

【问题讨论】:

  • 你试过使用CommonsChunkPlugin
  • 你说的是显式供应商块吗?
  • 是的,对所有供应商都使用一个供应商。第一次构建将是相同的,但下一次只会重新处理您的代码
  • 嗯,这是正常的速度,我担心 :( 同时使用 babel 和 typescript 会使构建时间加倍。你不能只使用 ts-loader 吗?
  • 也许测试服务器每次都运行 npm install ?也许它运行一个完整的构建(带有缩小等),而你只是在你的机器上运行一个开发构建?

标签: javascript reactjs typescript webpack babeljs


【解决方案1】:

有一件事,特别是在开发中,一定要设置mode

module.exports = {
  mode: "development"

  // Other options...
}

如果根本没有设置(看起来它不在共享的 webpack 配置中),它将default to "production"。这是理想的,因为您希望您的代码在生产模式下运行以进行部署,因为它会缩小、消除死代码、某些包(例如:React)根据环境提供不同的构建等等。

但是,如果您处于开发阶段,则在生产模式下运行可能会增加一些构建时间成本,因为执行这种缩减、消除死代码等会增加整体构建时间。这对于实际构建的产品来说是不可避免的,因此这对构建时间没有帮助,但假设您在开发中构建更多的东西应该可以节省一些时间。

此外,考虑将devtool 选项更改为更便宜的选项,例如cheap-module-eval-source-map 或文档中的其他选项之一:https://webpack.js.org/configuration/devtool/。文档解释了差异和构建时间成本。当前选项source-map 是最慢的选项之一。

module.exports = {
  devtool: "eval-cheap-module-source-map"

  // Other options...
}

【讨论】:

    【解决方案2】:

    删除dev-tool: source-maps 应该会加快编译时间。另外需要注意的是,由于输出超过 1mb,您的文件偏大。

    您还可以将cacheDirectory: true 标志添加到 babel-loader。我发现这大大加快了我在公司的构建速度。参考——https://webpack.js.org/loaders/babel-loader/#options

    当我希望 webpack 在监视模式下运行时,我个人也使用 --watch 标志。这让我可以更好地控制我希望它何时真正运行。

    【讨论】:

      【解决方案3】:

      你可以试试:

       devtool: 'eval',
      

      它会生成一个相当大的文件,但只需要一半的时间。不推荐用于生产。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-30
        • 1970-01-01
        • 2019-03-26
        • 1970-01-01
        • 2013-06-24
        • 2019-06-12
        • 2021-01-04
        相关资源
        最近更新 更多