详解webpack多页面配置记录


Posted in Javascript onJanuary 22, 2018

之前也写过webpack学习记录,项目中需要一个常用的webpack多页面配置,所以才动手,本着能写一行是一行的原则,开始了配置webpack之旅。

定目录结构

首先我只需要开发环境(包含自动更新)和打包环境,初定的目录结构是这样的

详解webpack多页面配置记录

app主要写业务代码,config里写webpack配置和一些打包、开发的配置,经过一番计较,最后根据自己习惯,目录结构如下:

详解webpack多页面配置记录 

app
 -libs # 第三方插件库,可以是css也可以是js,eg:jq
 -static # 公共的静态资源文件夹
 -temlates # 模板文件夹
  -*** # 模块文件夹
  -css # 当前模块独有的css文件需要在index.js中import
  -html # 模板文件,计划支持html,pug两种模板语言
  -index.js # 当前模块入口文件

配置webpack

按上面所说,建好文件后,在根目录新建webpack.config.js

然后全局安装webpack和webpack-dev-server

npm i webpack webpack-dev-server -g

然后局部安装

npm i webpack webpack-dev-server --save-dev

这样我们的项目就可以引入webpack了,并且可以使用webpack-dev-server的相关功能了,webpack.config.js内容非常的简单,就是根据环境变量中指定的当前环境来加载不同的webpack配置即可:

// 未指定这手动指定为生产环境
process.env.NODE_ENV = process.env.NODE_ENV ? process.env.NODE_ENV : 'product';
// 获取环境命令,并去除首尾空格
const env = process.env.NODE_ENV.replace( /(\s*$)|(^\s*)/ig, "" );
// 根据环境变量引用相关的配置文件
module.exports = require( `./config/webpack.config.${env}.js` )

在config文件夹下分别新建webpack.config.dev.js和webpack.config.product.js分别代表开发环境的配置和生成打包文件的配置,考虑到很多配置都会相同,再建一个webpack.config.base.js用来写统一的配置。

webpack.config.dev.js和webpack.config.product.js的区别是一个runtime时的配置,一个文件生成的配置,简而言之,就是开发环境的不同是配置webpack-dev-server,生产环境是压缩,map等配置

webpack.config.base.js文件才是webpack配置的主菜,包括entry、output、modules、plugins等

获得所有入口文件的文件夹

function getEntryDir() {
  let globPath = 'app/templates/**/*.' + config.tplLang
  // (\/|\\\\) 这种写法是为了兼容 windows和 mac系统目录路径的不同写法
  let pathDir = 'app(\/|\\\\)(.*?)(\/|\\\\)html'
  let files = glob.sync( globPath )
  let dirname, entries = []
  for ( let i = 0; i < files.length; i++ ) {
    dirname = path.dirname( files[ i ] )
    entries.push( dirname.replace( new RegExp( '^' + pathDir ), '$2' ) )
  }
  return entries;
}

注入entry和生成HTMLWebpackPlugin

getEntryDir()
  .forEach( ( page ) => {
    let moduleName = page.split( '/' )
    let moduleNameStr = moduleName[ moduleName.length - 1 ]
    const htmlPlugin = new HTMLWebpackPlugin( {
      filename: `${moduleNameStr}.html`,
      template: path.resolve( __dirname, `../app/${page}/html/index.${config.tplLang}` ),
      chunks: [ moduleNameStr, 'vendors' ],
    } );
    HTMLPlugins.push( htmlPlugin );
    Entries[ moduleNameStr ] = path.resolve( __dirname, `../app/${page}/index.js` );
  } )

关于HTMLWebpackPlugin的用法,可以参照html-webpack-plugin用法全解 以及 官方文档 已经写的非常详尽了。

第三方库入口自动获取

function getVendors() {
  let globPath = `app/${config.libraryDir}/**/*.*`
  let files = glob.sync( globPath )
  let libsArr = []
  files.forEach( ( v, i ) => {
    libsArr.push( './' + v )
  } )
  return libsArr
}
Entries[ 'vendors' ] = getVendors() // 第三方类库

其中多页面入口和第三方库配置,请看这篇webpack中文站文档分离 应用程序(app) 和 第三方库(vendor) 入口

output 配置

output: {
 filename: "static/js/[name].bundle.[hash].js",
 path: path.resolve( __dirname, config.devServerOutputPath )
}

webpack配置合并

主要用到一个webpack插件 webpack-merge,可把分开配置的config合并,分开生产环境和调试环境

最后奉上github地址: webpack-multi-skeleton ,有不对之处,请指正!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用javascript实现无刷新更新数据的详细步骤 asp
Dec 26 Javascript
jQuery 数据缓存data(name, value)详解及实现
Jan 04 Javascript
解决jQuery插件tipswindown与hintbox冲突
Nov 05 Javascript
jqeury eval将字符串转换json的方法
Jan 20 Javascript
jQuery动态设置form表单的enctype值(实现代码)
Jul 04 Javascript
详解vuelidate 对于vueJs2.0的验证解决方案
Mar 09 Javascript
Javascript通过控制类名更改样式
May 24 Javascript
layui实现给某一列加点击事件
Oct 26 Javascript
vue.js 子组件无法获取父组件store值的解决方式
Nov 08 Javascript
vue中使用带隐藏文本信息的图片、图片水印的方法
Apr 24 Javascript
基于vuex实现购物车功能
Jan 10 Vue.js
k8s node节点重新加入master集群的实现
Feb 22 Javascript
详解html-webpack-plugin用法全解
Jan 22 #Javascript
js构造函数创建对象是否加new问题
Jan 22 #Javascript
bmob js-sdk 在vue中的使用教程
Jan 21 #Javascript
vue计算属性时v-for处理数组时遇到的一个bug问题
Jan 21 #Javascript
Angular17之Angular自定义指令详解
Jan 21 #Javascript
laravel5.3 vue 实现收藏夹功能实例详解
Jan 21 #Javascript
详解node.js中的npm和webpack配置方法
Jan 21 #Javascript
You might like
html中select语句读取mysql表中内容
2006/10/09 PHP
PHP Zip压缩 在线对文件进行压缩的函数
2010/05/26 PHP
php json_encode奇怪问题说明
2011/09/27 PHP
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
2013/01/06 PHP
PHP实现微信小程序用户授权的工具类示例
2019/03/05 PHP
Gambit vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
在 IE 中调用 javascript 打开 Excel 表
2006/12/21 Javascript
csdn 博客的css样式 v3
2009/02/24 Javascript
jquery.post用法之type设置问题
2014/02/24 Javascript
js实现文字跟随鼠标移动而移动的方法
2015/02/28 Javascript
jQuery源码分析之Callbacks详解
2015/03/13 Javascript
Bootstrap编写一个在当前网页弹出可关闭的对话框 非弹窗
2016/06/30 Javascript
AngularJS基于ui-route实现深层路由的方法【路由嵌套】
2016/12/14 Javascript
node thread.sleep实现示例
2018/06/20 Javascript
在vue项目中使用md5加密的方法
2018/09/14 Javascript
vue中el-upload上传图片到七牛的示例代码
2018/10/19 Javascript
javascript中一些奇葩的日期换算方法总结
2018/11/14 Javascript
JS实现简单随机3D骰子
2019/10/24 Javascript
微信小程序封装多张图片上传api代码实例
2019/12/30 Javascript
vue3.0 的 Composition API 的使用示例
2020/10/26 Javascript
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
2017/04/17 Python
解决Python print输出不换行没空格的问题
2018/11/14 Python
简单了解Python变量作用域正确使用方法
2020/06/12 Python
python中K-means算法基础知识点
2021/01/25 Python
HTML5新增属性data-*和js/jquery之间的交互及注意事项
2017/08/08 HTML / CSS
安全标准化汇报材料
2014/02/03 职场文书
秋季运动会广播稿
2014/02/22 职场文书
党员公开承诺事项
2014/03/25 职场文书
服装设计专业自荐信
2014/06/17 职场文书
开展读书活动总结
2014/06/30 职场文书
工资收入证明样本(5篇)
2014/09/16 职场文书
2015年度党员个人总结
2015/02/14 职场文书
公司劳动纪律管理制度
2015/08/04 职场文书
2016年校园重阳节广播稿
2015/12/18 职场文书
2019财务管理制度最新范本!
2019/07/09 职场文书
Java 多线程协作作业之信号同步
2022/05/11 Java/Android