详解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 相关文章推荐
Jquery Select操作方法集合脚本之家特别版
May 17 Javascript
屏蔽网页右键复制和ctrl+c复制的js代码
Jan 04 Javascript
如何用javascript计算文本框还能输入多少个字符
Jul 29 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
Nov 03 Javascript
基于JavaScript实现的顺序查找算法示例
Apr 14 Javascript
JavaScript你不知道的一些数组方法
Aug 18 Javascript
微信小程序getPhoneNumber获取用户手机号
Sep 29 Javascript
微信小程序实现搜索指定景点周边美食、酒店
May 18 Javascript
vue路由传参页面刷新参数丢失问题解决方案
Oct 08 Javascript
深入webpack打包原理及loader和plugin的实现
May 06 Javascript
vue.js实现双击放大预览功能
Jun 23 Javascript
Vue scoped及deep使用方法解析
Aug 01 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
YII中assets的使用示例
2014/07/31 PHP
PHP获取当前相对于域名目录的方法
2015/06/26 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
2019/05/27 PHP
php时间戳转换代码详解
2019/08/04 PHP
JQuery读取XML文件数据并显示的实现代码
2009/12/16 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
JavaScript中的getMilliseconds()方法使用详解
2015/06/10 Javascript
javascript的几种继承方法介绍
2016/03/22 Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
2016/06/01 Javascript
JS中使用textPath实现线条上的文字
2017/12/25 Javascript
在Vue项目中使用d3.js的实例代码
2018/05/01 Javascript
微信小程序首页的分类功能和搜索功能的实现思路及代码详解
2018/09/11 Javascript
微信小程序系列之自定义顶部导航功能
2019/05/21 Javascript
nodejs简单抓包工具使用详解
2019/08/23 NodeJs
[01:12:35]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
Python写入数据到MP3文件中的方法
2015/07/10 Python
Python文本特征抽取与向量化算法学习
2017/12/22 Python
Python即时网络爬虫项目启动说明详解
2018/02/23 Python
python开启debug模式的方法
2019/06/27 Python
Numpy的简单用法小结
2019/08/28 Python
python 调试冷知识(小结)
2019/11/11 Python
python扫描线填充算法详解
2020/02/19 Python
Python接口测试结果集实现封装比较
2020/05/01 Python
通过实例简单了解python yield使用方法
2020/08/06 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
html5如何及时更新缓存文件(js、css或图片)
2013/06/24 HTML / CSS
工艺员岗位职责
2014/02/11 职场文书
岗位职责怎么写
2014/03/14 职场文书
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
安全资料员岗位职责范本
2014/06/28 职场文书
2014年绿化工作总结
2014/12/09 职场文书
2015年护士节慰问信
2015/03/23 职场文书
如何书写公司员工保密协议?
2019/06/27 职场文书
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/04/22 无线电
css3中transform属性实现的4种功能
2021/08/07 HTML / CSS