详解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 相关文章推荐
纯js实现瀑布流展现照片(自动适应窗口大小)
Apr 08 Javascript
js查找节点的方法小结
Jan 13 Javascript
JavaScript统计字符串中每个字符出现次数完整实例
Jan 28 Javascript
使用jQuery监听DOM元素大小变化
Feb 24 Javascript
AngularJS模仿Form表单提交的实现代码
Dec 08 Javascript
Javascript 详解封装from表单数据为json串进行ajax提交
Mar 29 Javascript
解决vue里碰到 $refs 的问题的方法
Jul 13 Javascript
vue2.0使用swiper组件实现轮播的示例代码
Mar 03 Javascript
Vue单页及多页应用全局配置404页面实践记录
May 22 Javascript
vue router 通过路由来实现切换头部标题功能
Apr 24 Javascript
详解JavaScript之ES5的继承
Jul 08 Javascript
JavaScript事件的委托(代理)的用法示例详解
Feb 18 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字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
2011/11/10 PHP
整理的一些实用WordPress后台MySQL操作命令
2013/01/07 PHP
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
PHP实现导出带样式的Excel
2016/08/28 PHP
PHP文件上传操作实例详解
2016/09/27 PHP
php实现断点续传大文件示例代码
2020/06/19 PHP
createElement动态创建HTML对象脚本代码
2008/11/24 Javascript
JS正则表达式获取分组内容的方法详解
2013/11/15 Javascript
技术男用来对妹子表白的百度首页
2014/07/23 Javascript
jquery中post方法用法实例
2014/10/21 Javascript
jQuery Easyui实现左右布局
2016/01/26 Javascript
jQuery基础知识点总结(必看)
2016/05/31 Javascript
jQuery解析XML 详解及方法总结
2016/09/28 Javascript
js实现移动端微信页面禁止字体放大
2017/02/16 Javascript
Node.js创建Web、TCP服务器
2017/12/05 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
2019/03/11 Javascript
在vue中使用G2图表的示例代码
2019/03/19 Javascript
vue组件实现移动端九宫格转盘抽奖
2020/10/16 Javascript
Vue 组件注册全解析
2020/12/17 Vue.js
[52:12]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Pycharm如何运行.py文件的方法步骤
2020/03/03 Python
HTML5印章绘制电子签章图片(中文英文椭圆章、中文英文椭圆印章)
2019/06/03 HTML / CSS
标签和贴纸印刷:Lightning Labels
2018/03/22 全球购物
MIXIT官网:俄罗斯最大的化妆品公司之一
2020/01/25 全球购物
工作中个人的自我评价
2013/12/31 职场文书
微观物理专业自荐信
2014/01/26 职场文书
主管会计岗位责任制
2014/02/10 职场文书
七一建党日演讲稿
2014/09/05 职场文书
民事诉讼代理委托书
2014/10/08 职场文书
简历自荐信范文
2015/03/09 职场文书
小学生光盘行动倡议书
2015/04/28 职场文书
2016党员干部廉洁自律心得体会
2016/01/13 职场文书
初一英语教学反思
2016/02/15 职场文书
小学五年级(说明文3篇)
2019/08/13 职场文书
MySQL 存储过程的优缺点分析
2021/05/20 MySQL
Java基于Dijkstra算法实现校园导游程序
2022/03/17 Java/Android