详解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 相关文章推荐
prototype 中文参数乱码解决方案
Nov 09 Javascript
javascript中方便增删改cookie的一个类
Oct 11 Javascript
Javascript 鼠标移动上去 滑块跟随效果代码分享
Nov 23 Javascript
JS短路原理的应用示例 精简代码的途径
Dec 13 Javascript
JavaScript调试技巧之console.log()详解
Mar 19 Javascript
javascript判断是手机还是电脑访问网页的简单实例分享
Jun 03 Javascript
微信小程序 window_x64环境搭建
Sep 30 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
Nov 18 Javascript
angularjs 的数据绑定实现原理
Jul 02 Javascript
Jquery让form表单异步提交代码实现
Nov 14 jQuery
浅谈javascript事件环微任务和宏任务队列原理
Sep 12 Javascript
原生js中运算符及流程控制示例详解
Jan 05 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面向对象全攻略 (十四) php5接口技术
2009/09/30 PHP
php 接口类与抽象类的实际作用
2009/11/26 PHP
php中print(),print_r(),echo()的区别详解
2014/12/01 PHP
Laravel实现搜索的时候分页并携带参数
2019/10/15 PHP
JQuery循环滚动图片代码
2011/12/08 Javascript
从数据结构的角度分析 for each in 比 for in 快的多
2013/07/07 Javascript
获取表单控件原始(初始)值的方法
2013/08/21 Javascript
js Math 对象的方法
2013/09/01 Javascript
JS获取select的value和text值的简单实例
2014/02/26 Javascript
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
JS组件Bootstrap导航条使用方法详解
2016/04/29 Javascript
CKEditor无法验证的解决方案(js验证+jQuery Validate验证)
2016/05/09 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
vue组件父与子通信详解(一)
2017/11/07 Javascript
webstorm中配置nodejs环境及npm的实例
2018/05/15 NodeJs
微信小程序将字符串生成二维码图片的操作方法
2018/07/17 Javascript
小程序实现左右来回滚动字幕效果
2018/12/28 Javascript
使用express获取微信小程序二维码小记
2019/05/21 Javascript
原生js通过一行代码实现简易轮播图
2019/06/05 Javascript
jQuery删除/清空指定元素的所有子节点实例代码
2019/07/04 jQuery
js get和post请求实现代码解析
2020/02/06 Javascript
python中 ? : 三元表达式的使用介绍
2013/10/09 Python
自己编程中遇到的Python错误和解决方法汇总整理
2015/06/03 Python
python验证码识别的实例详解
2016/09/09 Python
Python 模板引擎的注入问题分析
2017/01/01 Python
Django框架视图层URL映射与反向解析实例分析
2019/07/29 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
阿迪达斯比利时官方商城:adidas比利时
2016/10/10 全球购物
Oroton中国官网:澳洲知名奢侈配饰品牌
2017/03/26 全球购物
英国领先的运动营养品牌:Protein Dynamix
2018/01/02 全球购物
Under Armour安德玛德国官网:美国高端运动科技品牌
2019/03/09 全球购物
英国领先的豪华时尚家居网上商店:Amara
2019/08/12 全球购物
银行柜员与客户起冲突检讨书
2014/09/27 职场文书
继承公证书格式
2015/01/26 职场文书
一百条裙子读书笔记
2015/07/01 职场文书
2016高一新生军训心得体会
2016/01/11 职场文书