详解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 相关文章推荐
jquery 指南/入门基础
Nov 30 Javascript
ajax 缓存 问题 requestheader
Aug 01 Javascript
EXTJS记事本 当CompositeField遇上RowEditor
Jul 31 Javascript
JS实现的生成随机数的4个函数分享
Feb 11 Javascript
详解js图片轮播效果实现原理
Dec 17 Javascript
jQuery实现简单倒计时功能的方法
Jul 04 Javascript
关于jquery中动态增加select,事件无效的快速解决方法
Aug 29 Javascript
jQuery简单创建节点的方法
Sep 09 Javascript
JavaScript“尽快失败”的原则实例详解
Oct 08 Javascript
微信小程序 摇一摇抽奖简单实例实现代码
Jan 09 Javascript
JSON与js对象序列化实例详解
Mar 16 Javascript
前端js中的事件循环eventloop机制详解
May 15 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
第四节 构造函数和析构函数 [4]
2006/10/09 PHP
PHP+DBM的同学录程序(1)
2006/10/09 PHP
PHP学习散记_编码(json_encode 中文不显示)
2011/11/10 PHP
php自动加载机制的深入分析
2013/06/08 PHP
PHP7常量数组用法分析
2016/09/26 PHP
thinkPHP引入类的方法详解
2016/12/08 PHP
Prototype源码浅析 String部分(二)
2012/01/16 Javascript
js判断IE浏览器版本过低示例代码
2013/11/22 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
2014/01/03 Javascript
Jquery响应回车键直接提交表单操作代码
2014/07/25 Javascript
JQuery仿小米手机抢购页面倒计时效果
2014/12/16 Javascript
JS实现仿微博可关闭弹出层效果
2015/09/21 Javascript
JavaScript的removeChild()函数用法详解
2015/12/27 Javascript
js采用concat和sort将N个数组拼接起来的方法
2016/01/21 Javascript
node.js实现博客小爬虫的实例代码
2016/10/08 Javascript
js仿QQ邮箱收件人选择与搜索功能
2017/02/10 Javascript
在vue项目中使用Nprogress.js进度条的方法
2018/01/31 Javascript
详解webpack loader和plugin编写
2018/10/12 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
2019/03/11 Javascript
Vue组件通信的几种实现方法
2019/04/25 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
2019/09/29 Javascript
Node.js开发之套接字(socket)编程入门示例
2019/11/05 Javascript
Vue前端项目部署IIS的实现
2020/01/06 Javascript
Element Tooltip 文字提示的使用示例
2020/07/26 Javascript
如何使用 vue-cli 创建模板项目
2020/11/19 Vue.js
Python的Django框架中使用SQLAlchemy操作数据库的教程
2016/06/02 Python
python 2.7 检测一个网页是否能正常访问的方法
2018/12/26 Python
解决Django后台ManyToManyField显示成Object的问题
2019/08/09 Python
pytorch实现seq2seq时对loss进行mask的方式
2020/02/18 Python
Python DES加密实现原理及实例解析
2020/07/17 Python
工作失误检讨书范文大全
2014/01/13 职场文书
2014年小学美术工作总结
2014/12/20 职场文书
幼儿园国庆节活动总结
2015/03/23 职场文书
2015年文员个人工作总结
2015/04/09 职场文书
教你如何用python开发一款数字推盘小游戏
2021/04/14 Python
教你一步步实现一个简易promise
2021/11/02 Javascript