Webpack需要什么配置才能完成这些工作?

时间:2017-06-11 03:55:13

标签: javascript node.js reactjs webpack gulp

我一直在阅读和关注教程,但我被困住了。我能够完成教程中列出的内容,但不能将它们组合在一起。

我想编写一个可以执行以下操作的配置文件:

  1. 将Sass / Scss文件编译成CSS文件到公共文件夹中,而不是在任何地方内联它们。
  2. 将JSX / Es6文件透明化为一个文件(我知道了)。
  3. Css或Html更改时自动刷新/加载页面。
  4. Javascript更改时自动刷新/加载页面或React组件等。
  5. Plus通过我自己的Nodejs Express服务器运行,而不是使用webpack dev服务器,我想避免同时运行多个进程。他们让事情变得艰难。
  6. 每当Css或js文件发生更改时,请将哈希值放入文件名中以进行缓存清除。
  7. ...与上一步相关,请浏览所有模板并在生成它们的任何位置更新网址。
  8. ...删除旧的哈希文件。
  9. 缩小并生成源地图。
  10. 编译/透明文件,实时/热重新加载,哈希文件名,缩小和源图。

    现在我正在考虑放弃Webpack,只使用它进行转换并在Gulpjs中做所有事情。

    粗体的东西也是我遇到很多麻烦的地方。现有的解决方案包括生成JSON文件,并根据请求读取它们(inefficent!),生成完整的html文件并注入它们(打破许多流程,如果需要,可以使用特殊属性修改脚本标记,它们会被覆盖)。

2 个答案:

答案 0 :(得分:2)

没有一个适合所有人!

许多配置不一定绑定到webpack,它们可以在scripts的{​​{1}}条目中找到,或者只驻留在package.json的{​​{1}}中。当然,你可以在webpack中配置关于ES6的所有内容,但是你也可以只将它们放在package.json中,所以它更像是一种风味/团队惯例。为简单起见,我只想分享一个可行的解决方案:

您需要presets用于Sass / Scss,JSX / ES6转换

.babelrc
这里使用了

loaders,因为您可能不希望生产exports.module = { rules: [ { test: /\.scss$/, use: isProd ? ExtractTextPlugin.extract({ fallback: 'style-loader', use: ['css-loader', 'sass-loader'] }) : ['style-loader', 'css-loader', 'sass-loader'] }, { test: /\.js|jsx$/, use: 'babel-loader', exclude: /node_modules/ } ] } if (isProd) { module.exports.plugins = (module.exports.plugins || []).concat([ new ExtractTextPlugin({ filename: '[name].[contenthash].css' }) }) } css,但我仍然会在开发中使用它们。

代码热重新加载需要ExtractTextPlugininline个插件

甚至比HotModuleReplacement页面更好,它只会重新加载应用程序的更改部分(想想Ajax),这有助于更快地迭代,更重要的是,它可以帮助您保留状态您的应用,这对于react-hot-loaderAuto Refresh/Reload等有用的大型SPA非常重要。

state management

由于您不想 webpack-dev-server ,请提供 webpack-dev-middleware webpack-hot-middleware ,它们将在您的time travel debugging开发中使用:

if (isDev) {
    module.exports.entry.app = [
        'webpack-hot-middleware/client',
        'react-hot-loader/patch'
    ].concat(module.exports.entry.app)
    module.exports.plugins = (module.exports.plugins || []).concat([
        new webpack.HotModuleReplacementPlugin()
    ])
}

您需要server.js// compile your bundle.js on the fly (in memory serve) app.use(require("webpack-dev-middleware")(compiler, { noInfo: true, publicPath: "/" })) // notify the browser client updated bundle is ready app.use(require("webpack-hot-middleware")(compiler)) 来散列文件名并自动更新推荐的网址。

Code Splitting

要删除旧的散列文件,只需在package.json中使用简单的脚本

HtmlWebpackPlugin

您需要if (isProd) { module.exports.output = Object.assign({}, module.exports.output, { filename: '[name].[chunkhash].js', chunkFilename: '[id].[chunkhash].js' }) module.exports.plugins = (module.exports.plugins || []).concat([ new HtmlWebpackPlugin({ template: 'index.ejs', inject: true, chunksSortMode: 'dependency' }) }) } "scripts": { "build": "rm -rf public/** && NODE_ENV=production webpack --progress --hide-modules" } 个插件来缩小和生成源地图

UglifyJsPlugin

“总结”LoaderOptionsPlugin可能如下所示:

if (isProd) {
    module.exports.devtool = '#source-map'
    module.exports.plugins = (module.exports.plugins || []).concat([
        new webpack.optimize.UglifyJsPlugin({
            compress: {
                warnings: false
            },
            sourceMap: true
        }),
        new webpack.DefinePlugin({
            'process.env': {
                NODE_ENV: '"production"'
            }
        }),
        new webpack.LoaderOptionsPlugin({
            minimize: true,
            debug: false
        })
    ])
} else {
    module.exports.devtool = '#eval-source-map'
}

仅供参考,快乐调整!

如果您想要快速演示:https://github.com/lxynox/so-example-webpack

答案 1 :(得分:0)

  1. 将样式编译为单个文件 - 使用Webpack ExtractText Plugin
  2. 将ES6 / JSX透明化为ES5 - 您需要一个像Babel
  3. 这样的转录程序
  4. 检查点4
  5. 热重新加载 - 由于您提到您使用的是React,因此您可以使用react-hot-loader
  6. 通过自己的node.js服务器运行 - 使用webpack-dev-middleware
  7. 文件哈希 - 请检查此blog
  8. 与6相同
  9. 手动或通过某些cron-job
  10. 进行
  11. 缩小,生成源映射 - 检查生成版本的documentation