【问题标题】:Webpack: Taking a long time to buildWebpack:花费很长时间来构建
【发布时间】:2017-11-15 01:32:28
【问题描述】:

我的 react 应用程序中的 webpack 构建时间存在问题。一切都很好,但需要很长时间。

即使我只更改 CSS 重建的 JavaScript 文件?

CSS 编译的时间也比我想象的要长(如果我错了,请纠正我)?

我正在运行一个带有 16gb 内存的 Core i7,构建大约需要一分钟,这在开发过程中变得非常烦人,因为它是一行更改,你必须等待足够近的一分钟才能看到你的更改浏览器?

这是错误的方法吗?

const CleanObsoleteChunks = require('webpack-clean-obsolete-chunks');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const DashboardPlugin = require('webpack-dashboard/plugin');
const path = require('path');
const webpack = require('webpack');

const BUILD_DIR = path.resolve(__dirname, '../dist');
const APP_DIR = path.resolve(__dirname, 'src/');

const config = {
    devtool: 'source-map',
    entry: {
        "ehcp-coordinator": [
            APP_DIR + '/index.js'
        ]
    },

    output: {
        path: `${BUILD_DIR}/js/`,
        filename: '[name].js',
        chunkFilename: '[name]-chunk.js',
    },

    module: {
        rules: [
            {
                test: /\.js$/,
                exclude: /node_modules/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['es2015', 'es2017', 'react', 'stage-0'],
                        plugins: ['transform-runtime', 'transform-decorators-legacy', 'transform-class-properties', 'syntax-dynamic-import',
                          ["import", {"libraryName": "antd",  "style": false}]]
                    }
                }
            }, {
                test: /\.less$/,
                use: ExtractTextPlugin.extract({
                    use: [{
                        loader: "css-loader"
                    }, {
                        loader: "less-loader"
                    }]
                })
            }
        ]
    },

    plugins: [
        new webpack.DefinePlugin({
            'process.env.NODE_ENV': "'development'"
        }),
        new webpack.optimize.UglifyJsPlugin({
            'sourceMap': 'source-map'
        }),
        new webpack.optimize.CommonsChunkPlugin({
            name: 'vendor',
            filename: '[name].js',
            minChunks(module, count) {
                var context = module.context;
                return context && context.indexOf('node_modules') >= 0;
            }
        }),
        new ExtractTextPlugin("../css/[name].css")
    ],

    resolve: {
        modules: [
            path.resolve('./'),
            path.resolve('./node_modules'),
        ],
        extensions: ['.js', '.json']
    }

};

module.exports = config;

【问题讨论】:

  • 我建议只在生产环境中使用 UglifyJsPlugin 和 ExtractTextPlugin - 它们在编译时间方面相当繁重。另外,我认为您可以完全删除配置中的 resolve 部分 - 它似乎与默认值没有明显不同。
  • 大多数人倾向于拥有单独的开发和生产配置文件,或者(我的偏好)检查配置脚本中的process.env.NODE_ENV 以有条件地启用/禁用某些部分。
  • 抱歉忘了说这是 dev webpack 配置而不是 prod build 配置。还有为什么说只有 JS 发生了变化,为什么还要构建 CSS?
  • 您可以继续使用less-loader 和css-loader,只需将它们输入style-loader,而不是在开发中。这会在运行时将 CSS 注入页面头部,而不是将其放在单独的文件中。
  • 另外,如果你还没有,使用webpack-dev-server 而不是仅仅在监视模式下运行 Webpack - 使用开发服务器编译内存中的文件而不是将它们保存到磁盘,这进一步减少了开发中的编译时间。这意味着当您想要输出文件时必须手动运行构建,但无论如何您都需要这样做才能切换到生产配置。

标签: javascript reactjs webpack babeljs


【解决方案1】:

Medium 上的文章:https://medium.com/@gagan_goku/hot-reloading-a-react-app-with-ssr-eb216b5464f1

必须使用 SSR 为我的 React 应用程序 (HELO) 解决相同的问题。使用 SSR 会使事情变得复杂,但幸运的是,如果您指定 --mode=development,webpack 会变​​得更快,因为它是在内存中完成的。

webpack-dev-server 对我不起作用,因为我需要 client.js 包才能使 SSR 客户端正常工作。这是我的设置:

webpack.config.js:

const path = require('path');

module.exports = {
    entry: {
        client: './src/client.js',      // client side companion for SSR
        // bundle: './src/bundle.js',      // Pure client side app
    },
    output: {
        path: path.resolve(__dirname, 'assets'),
        filename: "[name].js"
    },
    module: {
        rules: [
            {
                test: /\.js$/,
                include: path.resolve(__dirname, 'src'),
                loader: "babel-loader",
                options: {
                    presets: [
                        '@babel/preset-env',
                        {'plugins': ['@babel/plugin-proposal-class-properties']},
                    ],
                }
            }
        ]
    },
    watchOptions: {
        aggregateTimeout: 1000,
        poll: 500,
        ignored: /node_modules/,
    }
};

package.json:

  "scripts": {
    // IMP: --mode=development
    "run-dev-ssr": "webpack --config webpack.config.js --watch --mode=development & babel src -d dist --watch & browser-refresh dist/server.js"
  }

.browser-refresh-ignore:

node_modules/
static/
.cache/
.*
*.marko.js
*.dust.js
*.coffee.js

.git/

# Add these files to ignore, since webpack is storing the compiled output to assets/ folder
src/
dist/

无模式的构建时间:

Hash: 81eff31301e7cb74bffd
Version: webpack 4.29.5
Time: 4017ms
Built at: 05/10/2019 9:44:10 AM

Hash: 64e10f26caf6fe15068e
Version: webpack 4.29.5
Time: 2548ms


Time: 5680ms
Time: 11343ms

使用模式构建时间:

Hash: 27eb1aabe54a8b995d67
Version: webpack 4.29.5
Time: 4410ms

Time: 262ms

Time: 234ms

Time: 162ms

【讨论】:

  • 在我的例子中,设置 mode: "development" 将大约 10 秒的构建时间减少到不到 0.5 秒,或者几乎是即时的。我的项目使用 Svelte、ts-loader,并使用 dev-server。我的项目刚刚开始,但需要 10 秒来构建项目。我想我没有设置mode: "development",因为我认为这是默认值,但默认值是"production"。而且OP的设置也漏掉了这个选项。
【解决方案2】:

就我而言,我将devtool 属性更新为false。

【讨论】:

    【解决方案3】:

    正如 cmets 中所讨论的,您可以进行以下最明显的更改来加快构建速度:

    • UglifyJsPlugin 和 ExtractTextPlugin 对编译时间的影响非常大,但实际上并没有在开发中带来很多切实的好处。在您的配置脚本中检查process.env.NODE_ENV,并根据您是否进行生产构建来启用/禁用它们。
      • 可以在开发中使用style-loader 代替ExtractTextPlugin,将CSS 注入HTML 页面的头部。这可能会在页面加载时导致无样式内容 (FOUC) 的短暂闪烁,但构建起来要快得多。
    • 如果您还没有,请使用webpack-dev-server 而不是仅在监视模式下运行 Webpack - 使用开发服务器在内存中编译文件而不是将它们保存到磁盘,这进一步减少了开发中的编译时间。
      • 这确实意味着当您想要将文件写入磁盘时必须手动运行构建,但无论如何您都需要这样做才能切换到生产配置。
    • 不确定这是否对性能有任何影响,但您的配置中的 resolve 部分与默认值没有明显不同,您应该能够将其删除而不会造成任何问题。

    【讨论】:

    • 谢谢,我会在某个时候尝试 webpack-dev-server,我们使用 nginx 作为代理运行我们的,所以不确定,但其他人肯定会缩短构建时间。
    猜你喜欢
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多