webpack打包多页面的方法


Posted in Javascript onNovember 30, 2018

前言

一开始接触webpack是因为使用Vue的关系,因为Vue的脚手架就是使用webpack构建的。刚开始的时候觉得webpack就是为了打包单页面而生的,后来想想,这么好的打包方案,只在单页面上使用是否太浪费资源了呢?如果能在传统多页面上使用webpack,开始效率是否会事半功倍呢?好在众多优秀的前端开发者已经写了许多demo和文章供人学习。我也写了一个小项目,希望对大家学习webpack有帮助。

好吧其实上面说的都是废话,接下来附上项目地址和干货,配合食用更佳。

webpack-multi-page

项目解决的问题

  • SPA好复杂,我还是喜欢传统的多页应用怎么破?又或是,我司项目需要后端渲染,页面模板怎么出?
  • 每个页面相同的UI布局好难维护,UI稍微改一点就要到每个页面去改,好麻烦还容易漏,怎么破?
  • 能不能整合进ESLint来检查语法?
  • 能不能整合postcss来加强浏览器兼容性?
  • 我可以使用在webpack中使用jquery吗?
  • 我可以使用在webpack中使用typescript吗?

src目录对应dist目录

webpack打包多页面的方法

当我们使用webpack打包多页面,我们希望src目录对应打包后dist目录是如上图这样的,开发根据页面模块的思路搭建开发架构,然后经过webpack打包,生成传统页面的构架。

/**
 * 创建打包路径
 */
const createFiles = function() {
 const usePug = require('../config').usePug;
 const useTypeScript = require('../config').useTypeScript;
 const path = require('path');
 const glob = require('glob');
 const result = [];
 const type = usePug ? 'pug' : 'html';
 const scriptType = useTypeScript ? 'ts' : 'js';
 const files = glob.sync(path.join(__dirname, `../src/views/**/*.${type}`));
 for (file of files) {
  result.push({
   name: usePug ? file.match(/\w{0,}(?=\.pug)/)[0] : file.match(/\w{0,}(?=\.html)/)[0],
   templatePath: file,
   jsPath: file.replace(type, scriptType),
   stylePath: file.replace(type, 'stylus')
  });
 }
 return result;
};

利用这个方法,我们可以获得需要打包的文件路径(方法中获取文件路径的模块也可使用fs模块),根据获得打包的文件路径,我们可以使用html-webpack-plugin来实现多页面打包。

由于每一个html-webpack-plugin的对象实例都只针对/生成一个页面,因此,我们做多页应用的话,就要配置多个html-webpack-plugin的对象实例:

const plugins = function() {
 const files = createFiles();
 const HtmlWebpackPlugin = require('html-webpack-plugin');
 const path = require('path');
 const ExtractTextPlugin = require('extract-text-webpack-plugin');

 let htmlPlugins = [];
 let Entries = {};
 files.map(file => {
  htmlPlugins.push(
   new HtmlWebpackPlugin({
    filename: `${file.name}.html`,
    template: file.templatePath,
    chunks: [file.name]
   })
  );
  Entries[file.name] = file.jsPath;
 });

 return {
  plugins: [
   ...htmlPlugins,
   new ExtractTextPlugin({
    filename: getPath => {
     return getPath('css/[name].css');
    }
   })
  ],
  Entries
 };
};

由于我使用了ExtractTextPlugin,因此这些CSS代码最终都会生成到所属chunk的目录里成为一个CSS文件。

模版引擎

每个页面相同的UI布局好难维护,UI稍微改一点就要到每个页面去改,好麻烦还容易漏,怎么破?

考虑到这个问题,项目引进并使用了pug模版引擎。

现在,我们可以利用pug的特性,创建一个共用组件:

demo.pug

p 这是一个共用组件

然后,当你需要使用这个公用组件时可以引入进来:

include 'demo.pug'

除此之外,你还可以使用一切pug特供的特性。

webpack中配置pug也很简单,先安装:

npm i --save-dev pug pug-html-loader

然后将所有.html后缀的改为.pug后缀,并且使用pug语法。

然后在规则中再增加一条配置

{
  test: /\.pug$/,
  use: 'pug-html-loader'
}

同时把plugins对象中的用到index.html的HtmlWebpackPlugin中的template,也要改成index.pug。

webpack整合eslint

先放出配置代码:

if (useEslint) {
 loaders.push({
  test: /\.js$/,
  loader: 'eslint-loader',
  enforce: 'pre',
  include: [path.resolve(__dirname, 'src')],
  options: {
   formatter: require('stylish')
  }
 });
}

通过webpack整合ESLint,我们可以保证编译生成的代码都是没有语法错误且符合编码规范的;但在开发过程中,等到编译的时候才察觉到问题可能也是太慢了点儿。

因此我建议可以把ESLint整合进编辑器或IDE里,像我本人在用vs code,就可以使用一个名为Eslint的插件,一写了有问题的代码,就马上会标识出来。

dev环境与prod环境

首先,阅读webpacl项目的时候通常要先看package.json这个文件。因为当你在命令行敲下一句命令

npm run dev

webpack就会找到package.json文件中的script属性并依次分析命令,可见,这句命令相应的会执行

nodemon --watch build/ --exec \"cross-env NODE_ENV=development webpack-dev-server --color --progress --config build/webpack.dev.js\"

同样的,当写下命令

npm run build

script就会执行

ross-env NODE_ENV=production webpack --config build/webpack.prod.js

这样就能区分开发环境,或是生产环境了。

虽然我们会为环境做区分,但是基于不重复原则,项目为两个环境公用的配置整合到了(build/webpack.base.js)文件中。然后利用webpack-merge插件将配置整合在一起

webpack中使用jquery

在webpack中使用jquery也很简单,我们可以在loaders中增加一条配置:

if (useJquery) {
 loaders.push({
  // 通过require('jquery')来引入
  test: require.resolve('jquery'),
  use: [
   {
    loader: 'expose-loader',
    // 暴露出去的全局变量的名称 随便你自定义
    options: 'jQuery'
   },
   {
    // 同上
    loader: 'expose-loader',
    options: '$'
   }
  ]
 });
}

然后当你需要在某个js文件使用jq时,引用暴露出来的变量名即可:

import $ from 'jQuery';

webpack中使用typescript

在webpack中使用jquery也很简单,我们可以在loaders中增加一条配置:

if (useTs) {
 loaders.push({
  test: /\.tsx?$/,
  use: 'ts-loader',
  exclude: /node_modules/
 });
}

然后将js文件改为ts即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
IE中jscript/javascript的条件编译
Sep 07 Javascript
javascript高亮效果的二种实现方法
Sep 14 Javascript
jquery中文乱码的多种解决方法
Jun 21 Javascript
Knockout数组(observable)使用详解示例
Nov 15 Javascript
jQuery 重复加载错误以及修复方法
Dec 16 Javascript
JavaScript常用脚本汇总(一)
Mar 04 Javascript
js中 javascript:void(0) 用法详解
Aug 11 Javascript
JavaScript常用正则函数用法示例
Jan 23 Javascript
微信小程序实现运动步数排行功能(可删除)
Jul 05 Javascript
jquery实现联想词搜索框和搜索结果分页的示例
Oct 10 jQuery
VUE:vuex 用户登录信息的数据写入与获取方式
Nov 11 Javascript
React+EggJs实现断点续传的示例代码
Jul 07 Javascript
Element Table的row-class-name无效与动态高亮显示选中行背景色
Nov 30 #Javascript
VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip
Nov 30 #Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
Nov 30 #Javascript
js字符串倒序的实例代码
Nov 30 #Javascript
实例讲解JavaScript截取字符串
Nov 30 #Javascript
支付宝小程序自定义弹窗dialog插件的实现代码
Nov 30 #Javascript
使用canvas实现一个vue弹幕组件功能
Nov 30 #Javascript
You might like
JavaScript 继承详解 第一篇
2009/08/30 Javascript
判断浏览器的内核及版本号方法汇总
2015/01/05 Javascript
对Web开发中前端框架与前端类库的一些思考
2015/03/27 Javascript
JS中使用FormData上传文件、图片的方法
2016/08/07 Javascript
jQuery使用deferreds串行多个ajax请求
2016/08/22 Javascript
Bootstrap基本插件学习笔记之轮播幻灯片(23)
2016/12/08 Javascript
JS请求servlet功能示例
2017/06/01 Javascript
使用Nodejs连接mongodb数据库的实现代码
2017/08/21 NodeJs
使用canvas进行图像编辑的实例
2017/08/29 Javascript
Vue使用枚举类型实现HTML下拉框步骤详解
2018/02/05 Javascript
解决layui中table异步数据请求不支持自定义返回数据格式的问题
2018/08/19 Javascript
vue+axios+element ui 实现全局loading加载示例
2018/09/11 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
vue生命周期的探索
2019/04/03 Javascript
vue项目首屏加载时间优化实战
2019/04/23 Javascript
vue-router 按需加载 component: () => import() 报错的解决
2020/09/22 Javascript
[36:20]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.17
2020/12/18 DOTA
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
2014/11/06 Python
深入浅析python定时杀进程
2016/06/06 Python
Python Queue模块详细介绍及实例
2016/12/27 Python
python调用Delphi写的Dll代码示例
2017/12/05 Python
python如何对实例属性进行类型检查
2018/03/20 Python
python使用turtle绘制分形树
2018/06/22 Python
Django中的forms组件实例详解
2018/11/08 Python
python 定时任务去检测服务器端口是否通的实例
2019/01/26 Python
Python closure闭包解释及其注意点详解
2019/08/28 Python
python+Selenium自动化测试——输入,点击操作
2020/03/06 Python
PyQt5+python3+pycharm开发环境配置教程
2020/03/24 Python
使用数据结构给女朋友写个Html5走迷宫游戏
2019/11/26 HTML / CSS
英国折扣高尔夫商店:Discount Golf Store
2019/11/19 全球购物
秘书行业自我鉴定范文
2013/12/30 职场文书
代理班主任的自我评价
2014/02/04 职场文书
公司委托书怎么写
2014/08/02 职场文书
销售会议开幕词
2015/01/28 职场文书
北京天坛导游词
2015/02/12 职场文书
理想国读书笔记
2015/06/25 职场文书