详解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 相关文章推荐
用于table内容排序
Jul 21 Javascript
jquery监听div内容的变化具体实现思路
Nov 04 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
Feb 13 Javascript
jQuery 删除/替换DOM元素的几种方式
May 20 Javascript
基于JS实现的倒计时程序实例
Jul 24 Javascript
window.onerror()的用法与实例分析
Jan 27 Javascript
微信JSAPI支付操作需要注意的细节
Jan 10 Javascript
详解Node中导入模块require和import的区别
Aug 11 Javascript
vue init webpack myproject构建项目 ip不能访问的解决方法
Mar 20 Javascript
vue实现带复选框的树形菜单
May 27 Javascript
JS中的算法与数据结构之链表(Linked-list)实例详解
Aug 20 Javascript
微信小程序实现底部弹出模态框
Nov 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 curl常见错误:SSL错误、bool(false)
2011/12/28 PHP
Thinkphp搭建包括JS多语言的多语言项目实现方法
2014/11/24 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
2014/12/16 PHP
php微信浏览器分享设置以及回调详解
2016/08/01 PHP
PHP5.6读写excel表格文件操作示例
2019/02/26 PHP
javascript eval函数深入认识
2009/02/21 Javascript
JS关闭窗口或JS关闭页面的几种代码分享
2013/10/25 Javascript
jQuery中:focus选择器用法实例
2014/12/30 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
2015/06/22 Javascript
javascript实现根据3原色制作颜色选择器的方法
2015/07/17 Javascript
JavaScript导航脚本判断当前导航
2016/07/12 Javascript
vue.js绑定class和style样式(6)
2016/12/09 Javascript
Angularjs 动态改变title标题(兼容ios)
2016/12/29 Javascript
js选项卡的制作方法
2017/01/23 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
2018/10/25 Javascript
使用mpvue搭建一个初始小程序及项目配置方法
2018/12/03 Javascript
VueX模块的具体使用(小白教程)
2020/06/05 Javascript
python求素数示例分享
2014/02/16 Python
对Python的Django框架中的项目进行单元测试的方法
2016/04/11 Python
详解Python开发中如何使用Hook技巧
2017/11/01 Python
python模拟事件触发机制详解
2018/01/19 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
解决Python3中的中文字符编码的问题
2018/07/18 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
使用matplotlib绘制图例标签中带有公式的图
2019/12/13 Python
Python通过4种方式实现进程数据通信
2020/03/12 Python
深入CSS3 动画效果的总结详解
2013/05/09 HTML / CSS
洛杉矶健身中心女性专用运动服饰品牌:Marika
2018/05/09 全球购物
Chicco婴儿用品美国官网:汽车座椅、婴儿推车、高脚椅等
2018/11/05 全球购物
SQL Server面试题
2016/10/17 面试题
英语教师自荐信
2014/05/26 职场文书
2014年重阳节活动策划方案书
2014/09/16 职场文书
单位介绍信格式
2015/01/31 职场文书
承诺书怎么写 ?
2019/04/16 职场文书
python利用while求100内的整数和方式
2021/11/07 Python
MySQL生成千万测试数据以及遇到的问题
2022/08/05 MySQL