详解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的渐进增强与平稳退化浅谈
Nov 12 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
Jun 06 Javascript
JS作为值的函数用法示例
Jun 20 Javascript
微信QQ的二维码登录原理js代码解析
Jun 23 Javascript
源码分析Vue.js的监听实现教程
Apr 23 Javascript
bootstrap多层模态框滚动条消失的问题
Jul 21 Javascript
利用Vue实现移动端图片轮播组件的方法实例
Aug 23 Javascript
Vue2.0父组件与子组件之间的事件发射与接收实例代码
Sep 19 Javascript
vue.js项目中实用的小技巧汇总
Nov 29 Javascript
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
Mar 28 jQuery
微信小程序bindinput与bindsubmit的区别实例分析
Apr 17 Javascript
vue路由拦截器和请求拦截器知识点总结
Nov 08 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生成图形(Libchart)实例
2013/11/06 PHP
浅谈php fopen下载远程文件的函数
2016/11/18 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
Javascript 模式实例 观察者模式
2009/10/24 Javascript
javascript删除字符串最后一个字符
2014/01/14 Javascript
浅谈Javascript中匀速运动的停止条件
2014/12/19 Javascript
运行Node.js的IIS扩展iisnode安装配置笔记
2015/03/02 Javascript
jQuery随机密码生成的方法
2015/03/09 Javascript
纯javascript移动优先的幻灯片效果
2015/11/02 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
基于JavaScript实现智能右键菜单
2016/03/02 Javascript
vue,angular,avalon这三种MVVM框架优缺点
2016/04/27 Javascript
BootStrap Validator使用注意事项(必看篇)
2016/09/28 Javascript
Bootstrap Search Suggest使用例子
2016/12/21 Javascript
微信小程序(六):列表上拉加载下拉刷新示例
2017/01/13 Javascript
AngularJS中下拉框的基本用法示例
2017/10/11 Javascript
jquery一键控制checkbox全选、反选或全不选
2017/10/16 jQuery
微信小程序实现鼠标拖动效果示例
2017/12/01 Javascript
vue awesome swiper异步加载数据出现的bug问题
2018/07/03 Javascript
微信小程序实现点赞、取消点赞功能
2018/11/02 Javascript
如何从头实现一个node.js的koa框架
2019/06/17 Javascript
[32:56]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.11
2020/12/16 DOTA
python 获取当天凌晨零点的时间戳方法
2018/05/22 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
2019/01/22 Python
python实现学员管理系统
2019/02/26 Python
python调试神器PySnooper的使用
2019/07/03 Python
简单了解Django ContentType内置组件
2019/07/23 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
2020/03/16 Python
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
装潢设计实习自我鉴定
2013/09/19 职场文书
工程项目经理岗位职责
2013/12/15 职场文书
药品业务员岗位职责
2014/04/17 职场文书
《小动物过冬》教学反思
2014/04/17 职场文书
岗位标兵事迹材料
2014/05/17 职场文书
工程部岗位职责
2015/02/10 职场文书
2019毕业论文致谢词
2019/06/24 职场文书