// 判斷是否帶production參數,production會壓縮js var isprod = false; for (var i in process.argv) { if (process.argv[i] === "-p" || process.argv[i] === "--production") { isprod = true; break; } }
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", }
new HtmlWebpackPlugin({ title: '', template: currentpath, filename: currentpath.replace("\\html\\", "\\dist\\"), minify: { "removeAttributeQuotes": true, "removeComments": true, "removeEmptyAttributes": true, } //chunks: ['index', 'vendors'], // 配置該html文件要添加的模塊 inject: 'body' })
loaders: [ // 先對html模板文件進行壓縮再預編 { test: /\.tpl/, loader: 'art-template!html-minifier' }, ]
... module: { .... }, // 也能夠將該配置移除,單獨一個配置文件postcss.config.js postcss: [postcss(), autoprefixer()], ...
sample-cli-config-file.conf的配置是比較完整的,請根據本身的狀況刪減配置。可將ample-cli-config-file.conf裏面的配置寫入htmlminify.config.js文件中,而後再webpack文件中使用css
var htmlMinifyOptions = require('./htmlminify.config.js'); //htmlminify的配置參數 ... plugins: [ new HtmlWebpackPlugin({ title: '後臺管理 . NOCOQ', template: path.resolve(CTRL_ROOT_PATH, 'views/home/index_tpl.cshtml'), filename: path.resolve(CTRL_ROOT_PATH, 'views/home/index.cshtml'), minify: isprod ? htmlMinifyOptions : false, // 生產模式下壓縮html文件 chunks: ['index', 'vendors'], // 配置要添加的模塊 inject: 'body' }), ], ...
每次運行webpack命令時,老是要寫一長串的命令,如:webpack --config webpack.admin.config.js --proccess --color,每次都這樣子寫,很麻煩!咱們能夠在package.json文件中配置一些咱們常常使用的命令;在package.json添加scripts節點:html
"scripts": { "admin-build": "webpack --config webpack.admin.config.js --proccess --color", "admin-watch": "webpack --config webpack.admin.config.js --proccess --color --watch", "admin-release": "webpack --config webpack.admin.config.js --proccess --color -p", }
而後就能夠在命令行中輸入簡短命令 npm run admin-build
執行了。node
因此請把html-minifier放在art-template的右邊,把sass-loader放在css-loader的右邊jquery
// 先對html模板文件進行壓縮再預編 { test: /\.tpl/, loader: 'art-template!html-minifier' }, { test: /\.scss$/, loader: ExtractTextPlugin.extract(["css-loader?sourceMap", "postcss-loader", "sass-loader?sourceMap"]) }
請改爲如下寫法:style-loader,必須和後面那堆分開,後面這堆必須寫在一塊兒。webpack
{ test: /\.css$/, loader: ExtractTextPlugin.extract("style", "css!postcss?" + cssparams) //style-loader與postcss-loader使用報錯的,修復的正確寫法 }, { test: /\.scss$/, loader: ExtractTextPlugin.extract("style", "css!postcss!sass?sourceMap") //巨坑 必須這麼寫 },
請參考9的修復方法。web
若是對你有幫助,請捐贈共勉(微信支付)
npm
如下是一個完整的webpack配置文件json
//webpack.config.js 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");// 提取/分離css var CleanWebpackPlugin = require('clean-webpack-plugin'); // 刪除文件 var CopyWebpackPlugin = require('copy-webpack-plugin'); // 拷貝文件 var BomPlugin = require('webpack-utf8-bom');//將文件轉成utf-8 bom格式,解決中文亂碼的問題 var postcss = require('postcss'); var autoprefixer = require('autoprefixer'); // 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 ROOT_PATH = path.resolve(__dirname); var CTRL_ROOT_PATH = path.resolve(__dirname, "administration"); var JS_SRC_PATH = path.resolve(CTRL_ROOT_PATH, 'dev'); var STATIC_SRC_PATH = path.resolve(CTRL_ROOT_PATH, "static_src"); var STATIC_DIST_PATH = path.resolve(CTRL_ROOT_PATH, 'static'); var cssparams = JSON.stringify({ sourceMap: true, discardComments: { removeAll: isprod } }); var htmlMinifyOptions = require('./htmlminify.config.js'); //htmlminify的配置參數 var JS_PATH_FORMAT = "[name]" + (isprod ? ".[hash:6]" : "") + ".js"; var CSS_PATH_FORMAT = "styles/[name]" + (isprod ? ".[contenthash:6]" : "") + ".css"; var FONT_PATH_FORMAT = "fonts/[name]" + (isprod ? ".[hash:6]" : "") + ".[ext]"; var IMG_PATH_FORMAT = "images/[name]" + (isprod ? ".[hash:6]" : "") + ".[ext]"; var VENDORS_PATH_FORMAT = "vendors" + (isprod ? ".[hash:6]" : "") + ".js"; module.exports = { entry: { index: path.resolve(JS_SRC_PATH, 'index.js'), login_index: path.resolve(JS_SRC_PATH, 'login_index.js'), vendors: ['jquery', 'datepicker'], //"jquery-ui": ["jquery-ui/themes/base/core.css", "jquery-ui/themes/base/datepicker.css", "jquery-ui/themes/base/theme.css"], //"style": [path.resolve(JS_SRC_PATH, 'styles/style.css')], }, output: { //context: path.resolve(__dirname, 'scripts'), path: path.resolve(STATIC_DIST_PATH), publicPath: '/administration/static/',//當生成的資源文件和站點不在同一地方時須要配置改地址 e.g.:站點在src,資源生成到/src/static/dist,那麼publicPath="/static/dist" filename: JS_PATH_FORMAT, chunkFilename: "[id].chunk.js", }, devtool: "source-map", plugins: [ //new webpack.ProvidePlugin({$: 'jquery'}), new ExtractTextPlugin(CSS_PATH_FORMAT, { allChunks: false }), new HtmlWebpackPlugin({ title: '後臺管理 . NOCOQ', template: path.resolve(CTRL_ROOT_PATH, 'views/home/index_tpl.cshtml'), filename: path.resolve(CTRL_ROOT_PATH, 'views/home/index.cshtml'), minify: isprod ? htmlMinifyOptions : false, // 生產模式下壓縮html文件 chunks: ['index', 'vendors'], // 配置要添加的模塊 inject: 'body' }), new HtmlWebpackPlugin({ title: '登陸後臺管理 . NOCOQ', template: path.resolve(CTRL_ROOT_PATH, 'views/account/login_tpl.cshtml'), filename: path.resolve(CTRL_ROOT_PATH, 'views/account/login.cshtml'), minify: isprod ? htmlMinifyOptions : false, // 生產模式下壓縮html文件 chunks: ['login_index', 'vendors'], // 配置要添加的模塊 inject: 'body' }), new CommonsChunkPlugin('vendors', VENDORS_PATH_FORMAT), new CleanWebpackPlugin(['static', 'build'], { root: CTRL_ROOT_PATH, verbose: true, dry: false, //exclude: ["dist/1.chunk.js"] }), new BomPlugin(true, /\.(cshtml)$/),//解決cshtml中文亂碼的問題 //new CopyWebpackPlugin([{ // from: 'faces', to: 'faces' //}]), /*new webpack.optimize.UglifyJsPlugin({ //beautify: false, compress: { warnings: false, }, output: { comments: false } }),*/ ], module: { // require unknownContextRegExp: /$^/, unknownContextCritical: false, // require(expr) exprContextRegExp: /$^/, exprContextCritical: false, // require("prefix" + expr + "surfix") wrappedContextRegExp: /$^/, wrappedContextCritical: false, loaders: [ { test: require.resolve('jquery'), loader: 'expose?$!expose?jQuery' },// 將jQuery暴露到全局變量中 { test: /\.css$/, loader: ExtractTextPlugin.extract("style", "css!postcss?" + cssparams) //style-loader與postcss-loader使用報錯的,修復的正確寫法 }, { test: /\.scss$/, loader: ExtractTextPlugin.extract("style", "css!postcss!sass?sourceMap") //巨坑 必須這麼寫 }, { test: /\.(woff|woff2|eot|ttf|svg)(\?[a-z0-9]+)?$/, loader: 'url-loader?limit=1000&name=' + FONT_PATH_FORMAT }, // 處理圖片url { test: /\.(png|jpg|gif)(\?[a-z0-9]+)?$/, loader: 'url-loader?limit=1000&name=' + IMG_PATH_FORMAT }, // 處理圖片url limit=1000 小於1kb則生成base64 { test: /\.js$/, exclude: /(node_modules|bower_components)/, loader: 'babel', // 'babel-loader' is also a valid name to reference query: { presets: ['es2015'] } }, //提取html中的img文件 { test: /\.html/, loader: 'html?root=' + path.resolve(HTML_SRC_PATH) }, // 先對html模板文件進行壓縮再預編 { test: /\.tpl/, loader: 'art-template!html-minifier' }, ] }, postcss: [postcss(), autoprefixer()], resolve: { alias: { "datepicker": "jquery-ui/ui/widgets/datepicker", } } };