Javascript Webpack执行这些操作需要什么配置?
我一直在阅读和遵循教程,但我被卡住了。我能够完成教程中列出的事情,但不能将它们结合在一起 我想编写一个配置文件来完成以下任务:Javascript Webpack执行这些操作需要什么配置?,javascript,node.js,reactjs,webpack,gulp,Javascript,Node.js,Reactjs,Webpack,Gulp,我一直在阅读和遵循教程,但我被卡住了。我能够完成教程中列出的事情,但不能将它们结合在一起 我想编写一个配置文件来完成以下任务: 将Sass/Scss文件编译成CSS文件并放入公用文件夹中,而不是在任何地方内联它们 将JSX/Es6文件转换为一个文件(我得到了这个) Css或Html更改时自动刷新/加载页面 当Javascript更改或响应组件等时自动刷新/加载页面 另外,通过我自己的Nodejs Express服务器运行,而不是使用webpack dev服务器,我希望避免同时运行多个进程。他们使
没有适合所有人的 许多配置不一定绑定到Web包,它们可以在
包.json的脚本
条目中找到,或者只驻留在的预设
中。当然,您可以在webpack中配置关于ES6的所有内容,但也只能将它们放在package.json中,因此这更像是一种风格/团队惯例。为了简单起见,我只想分享一个可行的解决方案:
对于Sass/Scss、JSX/ES6转换,您需要加载程序
ExtractTextPlugin
在这里使用,因为您可能不希望在生产中使用inline
css,但我仍将在开发中使用它们
您需要HotModuleReplacement
和react hot loader
插件来重新加载代码
甚至比自动刷新/重新加载
页面更好,它只会重新加载应用程序的更改部分(考虑Ajax),这有助于更快地迭代,更重要的是,它帮助您保留应用程序的状态,这对于大型SPA非常重要,其中状态管理
,时间旅行调试
等可能很有用
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()
])
}
由于您不需要webpack dev server,请尝试一下webpack dev middleware和webpack hot middleware,它们将用于开发中的服务器.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))
您需要代码拆分
和HtmlWebpackPlugin
来散列文件名并自动更新引用的URL。
要删除旧的散列文件,只需使用package.json中的简单脚本即可
"scripts": {
"build": "rm -rf public/** && NODE_ENV=production webpack --progress --hide-modules"
}
您需要UglifyJsPlugin
,LoaderOptionsPlugin
插件来缩小和生成源地图
“总结”webpack.config.js
可能如下所示:
const path = require('path')
const resolve = p => path.resolve(__dirname, p)
const webpack = require('webpack')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const isProd = process.env.NODE_ENV === 'production'
module.exports = {
entry: {
app: [
resolve('src/js/main.js')
]
},
output: {
path: resolve('public'),
filename: 'bundle.js'
},
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.devtool = '#source-map'
module.exports.output = Object.assign({}, module.exports.output, {
filename: '[name].[chunkhash].js',
chunkFilename: '[id].[chunkhash].js'
})
module.exports.plugins = (module.exports.plugins || []).concat([
new ExtractTextPlugin({
filename: '[name].[contenthash].css'
}),
new HtmlWebpackPlugin({
template: 'index.ejs',
inject: true,
chunksSortMode: 'dependency'
}),
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.entry.app = [
'webpack-hot-middleware/client',
'react-hot-loader/patch'
].concat(module.exports.entry.app)
module.exports.devtool = '#eval-source-map'
module.exports.plugins = (module.exports.plugins || []).concat([
new webpack.HotModuleReplacementPlugin()
])
}
仅供参考,快乐调整
如果您想要快速演示:没有适合所有人的
许多配置不一定绑定到Web包,它们可以在包.json的脚本
条目中找到,或者只驻留在的预设
中。当然,您可以在webpack中配置关于ES6的所有内容,但也只能将它们放在package.json中,因此这更像是一种风格/团队惯例。为了简单起见,我只想分享一个可行的解决方案:
对于Sass/Scss、JSX/ES6转换,您需要加载程序
ExtractTextPlugin
在这里使用,因为您可能不希望在生产中使用inline
css,但我仍将在开发中使用它们
您需要HotModuleReplacement
和react hot loader
插件来重新加载代码
甚至比自动刷新/重新加载
页面更好,它只会重新加载应用程序的更改部分(考虑Ajax),这有助于更快地迭代,更重要的是,它帮助您保留应用程序的状态,这对于大型SPA非常重要,其中状态管理
,时间旅行调试
等可能很有用
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()
])
}
由于您不需要webpack dev server,请尝试一下webpack dev middleware和webpack hot middleware,它们将用于开发中的服务器.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))
您需要代码拆分
和HtmlWebpackPlugin
来散列文件名并自动更新引用的URL。
要删除旧的散列文件,只需使用package.json中的简单脚本即可
"scripts": {
"build": "rm -rf public/** && NODE_ENV=production webpack --progress --hide-modules"
}
您需要UglifyJsPlugin
,LoaderOptionsPlugin
插件来缩小