webpack踩过的坑(总结)
使用process.argv 获取命令行使用的参数
// 判断是否带production参数,production会压缩js var isprod = false; for (var i in process.argv) { if (process.argv[i] === "-p" || process.argv[i] === "--production") { isprod = true; break; } }
url-loader 路径不正确,可通过 publicPath进行配置
output: { //context: path.resolve(__dirname, 'scripts'), path: path.resolve(HTML_DIST_PATH, "assets"), publicPath: '/dist/assets/',//当生成的资源文件和站点不在同一地方时需要配置改地址 e.g.:站点在src,资源生成到/src/static/dist,那么publicPath="/static/dist" filename: "[name].[hash:6].js", chunkFilename: "[id].chunk.js", }
html-webpack-plugin minify: true 报错,请改成
new HtmlWebpackPlugin({ title: '', template: currentpath, filename: currentpath.replace("\\html\\", "\\dist\\"), minify: { "removeAttributeQuotes": true, "removeComments": true, "removeEmptyAttributes": true, } //chunks: ['index', 'vendors'], // 配置该html文件要添加的模块 inject: 'body' }) //extract-text-webpack-plugin 同时使用style-loader和postcss-loader时会报错,将style-loader移除 ExtractTextPlugin.extract(["css-loader", "postcss-loader"])
完整的配置文件
var fs = require('fs'); var path = require('path'); var webpack = require('webpack'); var HtmlWebpackPlugin = require('html-webpack-plugin'); // 自动写入将引用写入html var CommonsChunkPlugin = require("webpack/lib/optimize/CommonsChunkPlugin"); // 提取公共模块 var ExtractTextPlugin = require("extract-text-webpack-plugin");// 默认的webpack 会将require("style.css")文件嵌入js文件中,使用该插件会将css从js中提取出来 var CleanWebpackPlugin = require('clean-webpack-plugin'); // 删除文件 var CopyWebpackPlugin = require('copy-webpack-plugin'); // 拷贝文件 var BomPlugin = require('webpack-utf8-bom');//将文件转成utf-8 bom格式,解决中文乱码的问题 var autoprefixer = require('autoprefixer') var cssparams = JSON.stringify({ discardComments: { removeAll: false } }); var htmlMinifyOptions = require('./htmlminify.config.js'); //htmlminify的配置参数 //定义了一些文件夹的路径 var ROOT_PATH = path.resolve(__dirname); var HTML_ROOT_PATH = path.resolve(__dirname, "html"); var HTML_SRC_PATH = path.resolve(ROOT_PATH, 'dev'); var HTML_DIST_PATH = path.resolve(ROOT_PATH, 'dist'); // process.argv 获取命令行使用的参数 // 判断是否带production参数,production会压缩js var isprod = false; for (var i in process.argv) { if (process.argv[i] === "-p" || process.argv[i] === "--production") { isprod = true; break; } } var config = { entry: { index: path.resolve(HTML_SRC_PATH, 'index.js'), vendors: ['jquery'], }, output: { //context: path.resolve(__dirname, 'scripts'), path: path.resolve(HTML_DIST_PATH, "assets"), publicPath: '/dist/assets/',//当生成的资源文件和站点不在同一地方时需要配置改地址 e.g.:站点在src,资源生成到/src/static/dist,那么publicPath="/static/dist" filename: "[name].[hash:6].js", chunkFilename: "[id].chunk.js", }, plugins: [ new ExtractTextPlugin("styles/[name].[contenthash:6].css", { allChunks: false /*是否将分散的css文件合并成一个文件*/ }), new CommonsChunkPlugin('vendors', 'vendors.[hash:6].js'), new CleanWebpackPlugin(['dist', 'build'], { root: ROOT_PATH, verbose: true, dry: false, //exclude: ["dist/1.chunk.js"] }), //new webpack.optimize.UglifyJsPlugin({ // beautify: true, // compress: { warnings: false, }, // output: { comments: true } //}), //new BomPlugin(true, /\.(cshtml)$/),//解决cshtml中文乱码的问题 ], module: { // 解决动态js url警告错误 unknownContextRegExp: /$^/, unknownContextCritical: false, // require(expr) exprContextRegExp: /$^/, exprContextCritical: false, // require("prefix" + expr + "surfix") wrappedContextRegExp: /$^/, wrappedContextCritical: false, // end loaders: [ { test: require.resolve('jquery'), loader: 'expose?$!expose?jQuery' },// 将jQuery暴露到全局变量中 { test: /\.css$/, loader: ExtractTextPlugin.extract(["css-loader", "postcss-loader"]) //同时使用style-loader和postcss-loader时会报错,将style-loader移除 }, { test: /\.(woff|woff2|eot|ttf|svg)(\?[a-z0-9]+)?$/, loader: 'url-loader?limit=1000&name=styles/fonts/[name].[hash:6].[ext]' }, // 处理图片url { test: /\.(png|jpg|gif)(\?[a-z0-9]+)?$/, loader: 'url-loader?limit=1000&name=styles/images/[name].[hash:8].[ext]' }, // 处理图片url limit=1000 小于1kb则生成base64 //{ test: /\.css$/, loaders: ['style-loader', 'css-loader', 'postcss-loader'] }, { test: /\.js$/, exclude: /(node_modules|bower_components)/, loader: 'babel', // 'babel-loader' is also a valid name to reference query: { presets: ['es2015'] } }, { test: /\.tpl/, loader: 'art-template-loader' }, ] }, postcss: [autoprefixer()], resolve: { alias: { "datepicker": "jquery-ui/ui/widgets/datepicker", } } }; // 遍历所有.html文件,使用HtmlWebpackPlugin将资源文件引入html中 var htmlfiles = fs.readdirSync(HTML_ROOT_PATH); htmlfiles.forEach(function (item) { var currentpath = path.join(HTML_ROOT_PATH, item); //console.log(currentpath); var extname = path.extname(currentpath); if (fs.statSync(currentpath).isFile()) { //console.log("replace", currentpath.replace("\\html\\", "\\dist\\")) config.plugins.push(new HtmlWebpackPlugin({ title: '', template: currentpath, filename: currentpath.replace("\\html\\", "\\dist\\"), minify: isprod ? htmlMinifyOptions : false, // 生产模式下压缩html文件 //chunks: ['index', 'vendors'], // 配置该html文件要添加的模块 inject: 'body' })) } }); module.exports = config;