详解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.AutoComplete.js中文修正版(支持firefox)
Apr 09 Javascript
JQuery扩展插件Validate 1 基本使用方法并打包下载
Sep 05 Javascript
从jQuery.camelCase()学习string.replace() 函数学习
Sep 13 Javascript
jquery validate在ie8下的bug解决方法
Nov 13 Javascript
JavaScript通过正则表达式实现表单验证电话号码
Mar 07 Javascript
javascript实现控制div颜色
Jul 07 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
May 31 Javascript
JS中如何实现复选框全选功能
Dec 19 Javascript
JavaScript伪数组用法实例分析
Dec 22 Javascript
vue单页面应用打开新窗口显示跳转页面的实例
Sep 21 Javascript
利用JS响应式修改vue实现页面的input值
Sep 02 Javascript
过滤器vue.filters的使用方法实现
Sep 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
无法载入 mcrypt 扩展,请检查 PHP 配置终极解决方案
2011/07/18 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
2014/07/25 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
2015/03/25 PHP
nginx+thinkphp下解决不支持pathinfo模式
2015/07/01 PHP
php生成固定长度纯数字编码的方法
2015/07/09 PHP
老司机传授Ubuntu下Apache+PHP+MySQL环境搭建攻略
2016/03/20 PHP
PHP最常用的正则表达式
2017/02/13 PHP
PHP 进度条函数的简单实例
2017/09/19 PHP
laravel与thinkphp之间的区别与优缺点
2021/03/02 PHP
学习js在线html(富文本,所见即所得)编辑器
2012/12/18 Javascript
jquery html动态生成select标签出问题的解决方法
2013/11/20 Javascript
javascript贪吃蛇完整版(源码)
2013/12/09 Javascript
JavaScript中双叹号!!作用示例介绍
2014/09/21 Javascript
JavaScript fontsize方法入门实例(按照指定的尺寸来显示字符串)
2014/10/17 Javascript
2014 年最热门的21款JavaScript框架推荐
2014/12/25 Javascript
Angular JS数据的双向绑定详解及实例
2016/12/31 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
2017/01/11 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
ES6教程之for循环和Map,Set用法分析
2017/04/10 Javascript
JavaScript数据结构与算法之队列原理与用法实例详解
2017/11/22 Javascript
Vue.js组件实现选项卡以及切换特效
2019/07/24 Javascript
返回上一个url并刷新界面的js代码
2020/09/12 Javascript
Vant 在vue-cli 4.x中按需加载操作
2020/11/05 Javascript
在Python的web框架中配置app的教程
2015/04/30 Python
python获取指定目录下所有文件名列表的方法
2015/05/20 Python
Python实现简单的代理服务器
2015/07/25 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
2017/01/20 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
2018/10/14 Python
HTML5 表单验证失败的提示语问题
2017/07/13 HTML / CSS
中国排名第一的外贸销售网站:LightInTheBox.com(兰亭集势)
2016/10/28 全球购物
2014年清明节寄语
2014/04/03 职场文书
房地产活动策划方案
2014/05/14 职场文书
英文演讲稿开场白
2014/08/25 职场文书
国庆节标语大全
2014/10/08 职场文书
写给老师的感谢信
2015/01/20 职场文书
反邪教观后感
2015/06/11 职场文书