详解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和as的稳定传值问题解决
Jul 14 Javascript
Javascript堆排序算法详解
Dec 03 Javascript
JavaScript跨平台的开源框架NativeScript
Mar 24 Javascript
理解JavaScript中Promise的使用
Jan 18 Javascript
js调用刷新界面的几种方式
May 03 Javascript
JavaScript实现打地鼠小游戏
Apr 23 Javascript
vue实现仿淘宝结账页面实例代码
Nov 08 Javascript
js中时间格式化的几种方法
Jul 22 Javascript
webpack常用配置总览(小结)
Nov 18 Javascript
基于javascript实现碰撞检测
Mar 12 Javascript
JavaScript闭包原理与用法学习笔记
May 29 Javascript
详解TS数字分隔符和更严格的类属性检查
May 06 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中for循环语句的几种变型
2007/03/16 PHP
php操作xml入门之xml基本介绍及xml标签元素
2015/01/23 PHP
php实现的递归提成方案实例
2015/11/14 PHP
PHP实现的文件浏览器功能简单示例
2019/09/12 PHP
原生JS实现加入收藏夹的代码
2013/10/24 Javascript
JavaScript中的Web worker多线程API研究
2014/12/06 Javascript
jquery让指定的元素闪烁显示的方法
2015/03/17 Javascript
详解javascript数组去重问题
2015/11/06 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
详解js前端代码异常监控
2017/01/11 Javascript
基于Bootstrap分页的实例讲解(必看篇)
2017/07/04 Javascript
angular中ui calendar的一些使用心得(推荐)
2017/11/03 Javascript
微信小程序页面生命周期详解
2018/01/31 Javascript
Vue 中使用vue2-highcharts实现曲线数据展示的方法
2018/03/05 Javascript
js DOM的事件常见操作实例详解
2019/12/16 Javascript
详细介绍Python语言中的按位运算符
2013/11/26 Python
Python random模块常用方法
2014/11/03 Python
给Python IDLE加上自动补全和历史功能
2014/11/30 Python
Python中SOAP项目的介绍及其在web开发中的应用
2015/04/14 Python
python制作一个桌面便签软件
2015/08/09 Python
Python日期的加减等操作的示例
2017/08/15 Python
django项目运行因中文而乱码报错的几种情况解决
2017/11/07 Python
python 不以科学计数法输出的方法
2018/07/16 Python
pygame游戏之旅 添加icon和bgm音效的方法
2018/11/21 Python
深入解析神经网络从原理到实现
2019/07/26 Python
python自动化工具之pywinauto实例详解
2019/08/26 Python
python KNN算法实现鸢尾花数据集分类
2019/10/24 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
家长会学生家长演讲稿
2013/12/29 职场文书
企业精细化管理实施方案
2014/03/23 职场文书
三八妇女节慰问信
2015/02/14 职场文书
观看《杨善洲》宣传教育片心得体会
2016/01/23 职场文书
《只有一个地球》教学反思
2016/02/16 职场文书
教师实习自我鉴定总结
2019/08/20 职场文书
MySQL 字符集 character
2022/05/04 MySQL
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
2022/09/23 Servers