详解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 相关文章推荐
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
Apr 12 Javascript
调用js时ie6和ie7,ff的区别
Aug 19 Javascript
JQuery Dialog的内存泄露问题解决方法
Jun 18 Javascript
基于jquery的文本框与autocomplete结合使用(asp.net+json)
May 30 Javascript
js分页代码分享
Apr 28 Javascript
JavaScript支持的最大递归调用次数分析
Jun 24 Javascript
JavaScript实现算术平方根算法-代码超简单
Sep 11 Javascript
js阻止移动端页面滚动的两种方法
Jan 25 Javascript
判断jQuery是否加载完成,没完成继续判断的解决方法
Dec 06 jQuery
彻底弄懂 JavaScript 执行机制
Oct 23 Javascript
javascript的惯性运动实现代码实例
Sep 07 Javascript
Vue实现鼠标经过文字显示悬浮框效果的示例代码
Oct 14 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
php版微信公众平台接口参数调试实现判断用户行为的方法
2016/09/23 PHP
PHP之将POST数据转化为字符串的实现代码
2016/11/03 PHP
html下载本地
2006/06/19 Javascript
用js判断用户浏览器是否是XP SP2的IE6
2007/03/08 Javascript
JQuery中判断一个元素下面是否有内容或者有某个标签的判断代码
2012/02/02 Javascript
js原生appendChild的bug解决心得分享
2013/07/01 Javascript
jQuery实现密保互斥问题解决方案
2013/08/16 Javascript
javascript框架设计读书笔记之数组的扩展与修复
2014/12/02 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
2015/08/27 Javascript
Nodejs中 npm常用命令详解
2016/07/04 NodeJs
js从数组中删除指定值(不是指定位置)的元素实现代码
2016/09/13 Javascript
如何实现星星评价(jquery.raty.js插件)
2016/12/21 Javascript
基于vue2.0+vuex+localStorage开发的本地记事本示例
2017/02/28 Javascript
Vue2.0使用过程常见的一些问题总结学习
2017/04/10 Javascript
Webpack打包css后z-index被重新计算的解决方法
2017/06/18 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
微信小程序带动画弹窗组件使用方法详解
2018/11/27 Javascript
详解vue-element Tree树形控件填坑路
2019/03/26 Javascript
JS事件流与事件处理程序实例分析
2019/08/16 Javascript
python采用requests库模拟登录和抓取数据的简单示例
2014/07/05 Python
Python实现去除列表中重复元素的方法小结【4种方法】
2018/04/27 Python
查看django版本的方法分享
2018/05/14 Python
使用python 3实现发送邮件功能
2018/06/15 Python
python得到windows自启动列表的方法
2018/10/14 Python
Python利用heapq实现一个优先级队列的方法
2019/02/03 Python
Python3解释器知识点总结
2019/02/19 Python
Python中Unittest框架的具体使用
2019/08/27 Python
Python尾递归优化实现代码及原理详解
2020/10/09 Python
python regex库实例用法总结
2021/01/03 Python
美国著名的婴儿学步鞋老品牌:Robeez
2016/08/20 全球购物
雷曼兄弟的五金店:Lehman’s Hardware Store
2019/04/10 全球购物
Java如何格式化日期
2012/08/07 面试题
餐饮业创业计划书范文
2014/01/06 职场文书
教师读书活动总结
2014/05/07 职场文书
务工证明怎么写
2015/06/18 职场文书
2015年法律事务部工作总结
2015/07/27 职场文书