【问题标题】:Slow initial webpack build初始 webpack 构建缓慢
【发布时间】:2017-12-04 01:04:50
【问题描述】:

我正在使用 React + Redux + Webpack,但每次重新运行节点服务器(使用 JetBrains WebStorm)时,webpack 需要 2.5 分钟才能将所有内容捆绑在一起,因此开发体验很烦人。

我尝试了所有可能的技术来加快 webpack initial 的构建速度,但没有成功。运行此程序需要 2.5 分钟。

我试过了:

  • Babel 缓存
  • Webpack 模块分析器
  • 不包括 node_modules

这是我的 webpack.config.js 文件:

let path = require('path')
let webpack = require('webpack')
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin

let entry = {
    bundle: './src/index',
    vendor: [
        'react',
        'react-dom',
        'redux',
        'react-redux',
        'react-router',
        'react-router-dom',
        'react-router-redux',
        'redux-thunk',
        'd3',
        'immutable',
        'moment',
        'axios',
        'openlayers',
        'react-table',
        'react-select',
        'reselect'
    ]
}

let plugins = [
    new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', filename: 'vendor.bundle.js' }),
    new webpack.DefinePlugin({
        'process.env': {
            NODE_ENV: JSON.stringify(ENV === 'prod' ? 'production' : 'development'),
            API_URL: JSON.stringify(API_URL),
            BASIC: JSON.stringify(BASIC)
        }
    }),
    new webpack.optimize.UglifyJsPlugin({
        beautify: false,
        comments: false,
        compress: {
            sequences   : true,
            booleans    : true,
            loops       : true,
            unused      : true,
            warnings    : false,
            drop_console: true,
            unsafe      : true
        }
    })
]

const config = {
    entry: entry,
    cache: true,
    devtool: 'cheap-module-source-map',
    output: {
        path: path.join(__dirname, 'dist'),
        filename: 'bundle.js',
        publicPath: '/dist/'
    },
    plugins: plugins,
    module: {
        rules: [
            {
                enforce: "pre",
                test: /\.js$/,
                exclude: /node_modules/,
                loader: "eslint-loader",
            },
            {
                test: /\.js$/,
                loader: 'babel-loader?cacheDirectory',
                query: {
                    plugins: ['transform-runtime']
                },
                include: [path.resolve(__dirname, "src")],
                exclude: /node_modules/
            },
            {
                test: /\.(css|less)$/,
                use: ['style-loader', 'css-loader', 'less-loader', 'postcss-loader']
            },
            {
                test: /\.(jpe?g|png|gif|svg)$/i,
                loaders: [
                    'file-loader?hash=sha512&digest=hex&name=[hash].[ext]',
                    `image-webpack-loader?${JSON.stringify(query)}`
                ]
            },
            {
                test: /\.(eot|woff|woff2|ttf)$/,
                loader: 'url-loader?limit=30000&name=[name]-[hash].[ext]'
            }
        ]
    }
}

module.exports = config

这是我的 package.json 文件:

{
  "name": "Aloha",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {
    "start": "node server.js",
    "start-debug": "node $NODE_DEBUG_OPTION server.js",
    "build": "webpack",
    "test": "jest --verbose",
    "test:watch": "npm test -- --watch",
    "test-coverage": "jest --coverage",
    "webpack-stats": "webpack --profile",
    "startwatch": "nodemon server.js"
  },
  "author": "Aloha",
  "license": "ISC",
  "devDependencies": {
    "@amcharts/amcharts3-react": "^3.0.0",
    "babel-core": "^6.11.4",
    "babel-eslint": "^8.0.3",
    "babel-loader": "^7.1.2",
    "babel-plugin-transform-runtime": "^6.9.0",
    "babel-preset-react": "^6.11.1",
    "babel-preset-stage-0": "^6.5.0",
    "css-loader": "^0.28.4",
    "eslint": "^4.12.1",
    "eslint-loader": "^1.4.1",
    "eslint-plugin-react": "^7.0.1",
    "file-loader": "^1.1.5",
    "image-webpack-loader": "^3.3.1",
    "less": "^2.7.1",
    "less-loader": "^4.0.5",
    "postcss-loader": "^2.0.9",
    "redux-mock-store": "^1.2.1",
    "style-loader": "^0.19.0",
    "url-loader": "^0.6.2",
    "webpack-bundle-analyzer": "^2.9.1",
    "webpack-dev-middleware": "^1.10.2",
    "webpack-hot-middleware": "^2.12.1"
  },
  "dependencies": {
    "axios": "^0.17.1",
    "babel-preset-es2017": "^6.24.1",
    "body-parser": "^1.17.2",
    "classnames": "^2.2.5",
    "compression": "^1.6.2",
    "connect-multiparty": "^2.0.0",
    "cookie-parser": "^1.4.3",
    "d3": "^4.3.0",
    "dotenv": "^4.0.0",
    "express": "^4.15.3",
    "history": "^4.7.2",
    "http-proxy-middleware": "^0.17.4",
    "immutable": "^3.8.1",
    "lodash": "^4.17.4",
    "moment": "^2.14.1",
    "moment-timezone": "^0.5.13",
    "nodemon": "^1.12.1",
    "openlayers": "^4.5.0",
    "prop-types": "^15.5.10",
    "querystring": "^0.2.0",
    "rc-collapse": "^1.7.5",
    "react": "^16.2.0",
    "react-block-ui": "^1.1.1",
    "react-datetime": "^2.8.6",
    "react-dom": "^16.2.0",
    "react-imageloader": "^2.1.0",
    "react-notification-system": "^0.2.15",
    "react-redux": "^5.0.5",
    "react-router-dom": "^4.2.2",
    "react-router-redux": "^5.0.0-alpha.8",
    "react-select": "^1.0.0-rc.5",
    "react-table": "^6.7.4",
    "react-tabs": "^2.1.1",
    "redux": "^3.7.2",
    "redux-thunk": "^2.1.0",
    "request": "^2.74.0",
    "reselect": "^3.0.1",
    "webpack": "^3.9.1"
  }
}

我们将不胜感激!

【问题讨论】:

  • 为什么需要重新运行服务器?你的 webpack 开发服务器是否为热重载正确设置?
  • 你需要从其他加载器(url/style/file)中排除node_modules吗?它可能正在检查每个节点模块目录中的 css 文件或图像文件吗? HappyPack 是一个很棒的工具,它还可以通过并行化任务来节省构建时间
  • 你的 babelrc 文件的内容是什么?
  • 对不起,你的 postcss 配置 JS 文件,如果你有的话?

标签: javascript reactjs webpack


【解决方案1】:

老实说,这并不令人惊讶。这在很大程度上取决于您的代码和机器的复杂性。我在高端 iMac 上的项目大约需要 1 分 15 秒。

就个人而言,如果您是开发新手,create-react-app 仍然是一个很好的起点,因为它具有热重载功能。使用 webpack watch 或类似的东西,这样您就可以在开发时看到更新。

更改后应该没有理由重新运行节点服务器。重新运行节点的唯一时间是部署时。

【讨论】:

    【解决方案2】:

    你可以连接 webpack 开发服务器,我很确定使用concurrently 可以找到解决方案

    在 package.json 中,输入"dev":"concurrently \"npm run server\" \"npm run client\""

    "server":"nodemon index.js""client":"webpack-dev-server ..." 的位置。

    我还没有测试过这个确切的设置,但确实可以将它与 create react app 一起使用,其中客户端很简单

    npm run start --prefix client
    

    【讨论】:

      【解决方案3】:

      这在很大程度上取决于您的机器。确保您的项目有足够的磁盘空间和良好的处理器。 除此之外,如需更多改进,您可以通过此link

      【讨论】:

        猜你喜欢
        • 2019-06-12
        • 1970-01-01
        • 1970-01-01
        • 2016-04-08
        • 2016-01-24
        • 2018-08-25
        • 2014-11-18
        • 2014-02-04
        • 2014-08-04
        相关资源
        最近更新 更多