webpack多页面配置
时间:2019-08-19
本文章向大家介绍webpack多页面配置,主要包括webpack多页面配置使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
webpack.common.js
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.js
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, }, } }) ] });
原文地址:https://www.cnblogs.com/beileixinqing/p/11213132.html
- Start transaction not working with Revit 2014
- 零基础学编程034:解决一个pandas问题
- ShellExecute 启动外部程序 参数详细介绍
- 零基础学编程033:字符串的split拆分与join连接
- 零基础学编程032:生成二维码
- C#,一些非常简单但应该知道的知识点
- C#神奇的扩展方法
- 使用Python制作一个简单的刷博器
- 零基础学编程031:Python与其它语言最不同的一条语法规则
- dedecms批量导出新增文章url和标题
- 明理知意:复合索引优化及索引访问原理
- WCF配置文件与文件下载之坎坷路
- 零基础学编程030:像黑客般玩玩字符艺术
- Android获取SD卡总容量,可用大小,机身内存总容量及可用大小
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android自定义View实现QQ运动积分转盘抽奖功能
- 请简述Spring JDBC是如何进行配置的
- Java高频面试题 -- 静态
- 2020Java核心面试题--基础题
- 一日一技:在网页上如何获取鼠标当前指向的元素
- B树和B+树
- 根据CCDS数据库信息拿到全部外显子坐标
- 查找算法其实不简单
- 一日一技:如何防止 Homebrew 自动升级和自动清理过期程序
- 吐血整理--史上最全排序算法Python实现
- 2020数据库最新面试题常考汇总
- [剑指Offer]面试题25: 合并两个排序的链表
- 环形链表
- 二十年前做科研你只需要检测一些基因在一些癌症细胞系表达量情况即可
- [剑指Offfer]面试题22: 链表中倒数第k个节点