webpack.common.jsjavascript
const webpack = require("webpack"); const path = require('path'); const glob = require('glob'); const HtmlWebpackPlugin = require('html-webpack-plugin'); // html引擎 const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const HtmlWebpackInlineSourcePlugin = require('html-webpack-inline-source-plugin'); const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); let outputfile = '' function buildEntriesAndHTML() { // 用來構建entry const result = glob.sync('views/**/*.js'); const config = { hash: false, inject: true }; const entries = {}; const htmls = []; result.forEach(item => { const one = path.parse(item); outputfile = one.dir.split('/').slice(-1)[0]; entries[outputfile] = './' + item; const filename = { 'development':'./' + outputfile + '/index.html', 'production':'./' + outputfile + '/'+outputfile+'.html', } htmls.push( new HtmlWebpackPlugin({ ...config, template: './' + one.dir + '/index.html', filename: filename[process.env.NODE_ENV], // 輸出html文件的路徑 title:outputfile+'模版', chunks: [outputfile], // inlineSource: '.(js|css)' //配合HtmlWebpackInlineSourcePlugin 插件,若是不須要將css,js內聯則不用寫 }) ); }); // 若是不須要將css,js內聯則不用寫 /*if (htmls.length > 0) { htmls.push(new HtmlWebpackInlineSourcePlugin()); }*/ return { entries, htmls }; } const final = buildEntriesAndHTML(); module.exports = { entry: final.entries, module: { rules: [ { test: /\.css$/, use: [ MiniCssExtractPlugin.loader, 'css-loader', {loader: 'postcss-loader', options: {plugins: [require("autoprefixer")("last 100 versions")]}} ] }, { test: /\.less$/, use: [ MiniCssExtractPlugin.loader, 'css-loader?importLoaders=1', {loader: 'postcss-loader', options: {plugins: [require("autoprefixer")("last 100 versions")]}}, 'less-loader' ] }, { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, /*use:[ { loader: 'url-loader', options: { limit: 1024 * 10, name: 'image/[name].[ext]', fallback: 'file-loader' } }, { loader: 'image-webpack-loader',// 壓縮圖片 options: { bypassOnDebug: true, } } ]*/ use: [ { loader: 'file-loader', options: { // name: outputfile+'/static/assets/[name].[ext]', name: './static/assets/[name].[ext]', } }, { loader: 'image-webpack-loader',// 壓縮圖片 options: { bypassOnDebug: true, } } ] }, { test: /\.(mp4|webm|ogg|mp3|wav|flac|aac|swf|mov)(\?.*)?$/, use: [ { loader: 'file-loader', options: { name: 'media/[name].[hash:7].[ext]', } }, ] }, { test: /\.js$/, exclude: [ /node_modules/, path.resolve(__dirname, "assets/javascripts/swiper.min.js"), ], use: { loader: "babel-loader" } }, { test: /\.html$/, use: [ { loader: "html-loader", options: { minimize: true,// 加載器切換到優化模式,啓用壓縮。 caseSensitive:true // 以區分大小寫的方式處理屬性(對於自定義HTML標記頗有用),即禁止html標籤所有轉爲小寫 } } ] } ] }, plugins: [ new OptimizeCSSAssetsPlugin({ assetNameRegExp: /\.css\.*(?!.*map)/g, //注意不要寫成 /\.css$/g cssProcessor: require('cssnano'), cssProcessorOptions: { discardComments: {removeAll: true}, // 避免 cssnano 從新計算 z-index safe: true, // cssnano 集成了autoprefixer的功能 // 會使用到autoprefixer進行無關前綴的清理 // 關閉autoprefixer功能 // 使用postcss的autoprefixer功能 autoprefixer: false }, canPrint: true }), new MiniCssExtractPlugin({ filename: '[name]/[name].css', chunkFilename: '[name].css' }), ...final.htmls ], resolve: { extensions: ['.js', '.json', '.jsx', '.css'] }, }
webpacl.prod.jscss
const merge = require('webpack-merge'); const UglifyJSPlugin = require('uglifyjs-webpack-plugin'); const CleanWebpackPlugin = require('clean-webpack-plugin'); const common = require('./webpack.common.js'); const path = require('path') const BUILD_PATH = path.resolve(__dirname,'dist') // 打包模板生成路徑 module.exports = merge(common, { output: { // 出口文件 path: BUILD_PATH, publicPath: '/', filename: '[name]/[name].js' //輸出文件 }, devtool: 'source-map', plugins: [ new CleanWebpackPlugin(['dist']), new UglifyJSPlugin({ sourceMap: true, uglifyOptions: { output: { comments: true, }, } }) ] });