webpack实用小功能介绍


Posted in Javascript onJanuary 02, 2018

上一次分享了vue2-webpack3,大多都是一些基础的内容,本期继续分享一些webpack比较实用的功能

1.overlay

overlay属于devServer的属性,配置案例如下:

devServer: {
 overlay: {
  errors: true,
  warnings: true
 }
}

配置很简单,那它的作用是什么呢?overlay的作用是可以在浏览器打开的页面显示终端编译时产生的错误。通过配置该属性,以后在写代码的时候,编译如果出错了,我们就不需要打开终端看到底是什么报错了,可以直接在页面里看到错误,对于开发而言确实很方便。

2.require.ensure

相比较overlay,require.ensure可以的作用更加实用,上次讲的vue2-webpack3我们配置的是多页面的应用,但是如果是SPA应用呢?

我们最容易遇到的问题代码全部打包在一个js里面,导致这个js过于庞大,最终导致应用首次加载时等待时间过长,那么该怎么解决这个问题呢?require.ensure就是专门用来解决这个问题的。

该怎么使用?

使用起来也很简单,只要按照下面的写法来进行vue的router配置即可:

const Layout = require('../Layout')
const Home = r => require.ensure([], () => r(require('../home'), home)
export default [{
 path: '/',
 component: Layout,
 children: [{
  path: '',
 component: Home
 }]
}]

可以看到require.ensure有三个参数

第一个参数的作用是配置依赖列表,被依赖的模块会和当前模块打包到一起; 第二个参数是一个函数,将要单独打包的模块传入回调里; 第三个参数是chunkname,可用来配置js的文件名; 配置完了以后,当我们加载这个页面的时候,属于每个页面自己的代码部分,就会单独去加载了。

3.webpack-bundle-analyzer

这是一个webpack的插件,它的主要作用是用来分析我们模块打包的资源情况,非常的直观,也非常的实用,下面我们先看下它的效果图:

webpack实用小功能介绍 

那么该如何配置呢? 首先你得先install,然后配置如下:

const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
plugins = [
 new BundleAnalyzerPlugin({
 // Can be `server`, `static` or `disabled`.
 // In `server` mode analyzer will start HTTP server to show bundle report.
 // In `static` mode single HTML file with bundle report will be generated.
 // In `disabled` mode you can use this plugin to just generate Webpack Stats JSON file by setting `generateStatsFile` to `true`.
 analyzerMode: 'server',
 // Host that will be used in `server` mode to start HTTP server.
 analyzerHost: '127.0.0.1',
 // Port that will be used in `server` mode to start HTTP server.
 analyzerPort: 8888,
 // Path to bundle report file that will be generated in `static` mode.
 // Relative to bundles output directory.
 reportFilename: 'report.html',
 // Module sizes to show in report by default.
 // Should be one of `stat`, `parsed` or `gzip`.
 // See "Definitions" section for more information.
 defaultSizes: 'parsed',
 // Automatically open report in default browser
 openAnalyzer: true,
 // If `true`, Webpack Stats JSON file will be generated in bundles output directory
 generateStatsFile: false,
 // Name of Webpack Stats JSON file that will be generated if `generateStatsFile` is `true`.
 // Relative to bundles output directory.
 statsFilename: 'stats.json',
 // Options for `stats.toJson()` method.
 // For example you can exclude sources of your modules from stats file with `source: false` option.
 // See more options here: https://github.com/webpack/webpack/blob/webpack-1/lib/Stats.js#L21
 statsOptions: null,
 // Log level. Can be 'info', 'warn', 'error' or 'silent'.
 logLevel: 'info'
 })
]

是不是很简单却很实用呢~

4.DllPlugin+DllReferencePlugin

在使用webpack开发的过程中,相信很多人都会觉得有时候项目启动编译时间等待太久了,为什么呢?因为当项目慢慢庞大起来的时候,我们依赖的模块越来越多,每次项目启动编译都需要全部编译打包,所以自然会导致编译时间偏长,那如何解决这个问题呢?

首先思路是这样的,一般node_modules文件中的依赖,基本上是不会去做改变的,所以没有必要每次都去进行打包,我们完全可以将这些依赖提前打包好,然后就可以一直使用了。

DllPlugin就是用来提前打包我们的依赖包的插件。DllPlugin分为两个插件,一个是DllPlugin,另一个是DllReferencePlugin。

首先DllPlugin的作用是用来提前打包好依赖,步骤如下:

新建一个vendor.js,用来引入所有我们依赖的模块:

import Vue from 'vue';
import ElementUI from 'element-ui';
import VouRouter from 'vue-router';

新建一个webpack.config.dll.js的配置文件,配置如下:

const path = require('path');
const webpack = require('webpack');
module.exports = {
 entry: {
  vendor: [path.resolve(__dirname, 'vendor')]
 },
 output: {
  path: path.resolve(__dirname, './dll'),
 filename: 'dll.[name].js',
 library: '[name]'
 },
 plugins: [
 new webpack.DllPlugin({
 path: path.join(__dirname, "./dll", "[name]-manifest.json"),
 name: "[name]"
 })
 ],
 resolve: {
 extensions: ['js']
 }

配置好了以后,就可以到终端里运行webpack --config webpack.config.dll.js了,然后就能在你的dist/dll目录下看到一个dll.vendore.js和一个vendor-manifest.json文件,到此DllPlugin提取依赖的作用就完成了。

下面是DllReferencePlugin的配置,这个配置更简单,找到项目原本的webpack.config.js文件,然后配置如下:

module.exports = {
 plugins: [
  new webpack.DllReferencePlugin({
   context: path.join(__dirname, "src"),
   manifest: require("./dll/vendor-manifest.json")
  })
 ]
}

这样就都配置好了,但是这样做还存在个问题,当你运行项目时,会提示:

You are using the runtime-only build of Vue...

大概的意思就是说因为你使用了vue的template,使用的vue版本不对,所以我在webpack.config.dll.js里面对vue做如下设置:

alias: {
 'vue$': 'vue/dist/vue.common.js'
}

否则会默认打包vue.runtime.common.js,正确的应该是打包vue.common.js这个文件。做了以上配置以后,本以为就OK了,但还是太天真,依旧还是报了一样的错误。

然后我到webpack.config.js里面做了同样的配置,结果就OK了。但是这会导致vue被打包了两份,所以暂时只能放弃在vendor内引入vue了,导致该问题的原因暂不明了。

Javascript 相关文章推荐
jQuery中innerWidth()方法用法实例
Jan 19 Javascript
jQuery中slideUp 和 slideDown 的点击事件
Feb 26 Javascript
JavaScript使用Prototype实现面向对象的方法
Apr 14 Javascript
Iscrool下拉刷新功能实现方法(推荐)
Jun 26 Javascript
Vue2.0父组件与子组件之间的事件发射与接收实例代码
Sep 19 Javascript
Vue-Router2.X多种路由实现方式总结
Feb 09 Javascript
快速搭建vue2.0+boostrap项目的方法
Apr 09 Javascript
Vue前端开发规范整理(推荐)
Apr 23 Javascript
vue实现类似淘宝商品评价页面星级评价及上传多张图片功能
Oct 29 Javascript
vue项目搭建以及全家桶的使用详细教程(小结)
Dec 19 Javascript
微信小程序下拉框组件使用方法详解
Dec 28 Javascript
vue route新窗口跳转页面并且携带与接收参数
Apr 10 Vue.js
js最简单的双向绑定实例讲解
Jan 02 #Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
Jan 02 #Javascript
js原生方法被覆盖,从新赋值原生的方法
Jan 02 #Javascript
JS实现验证码倒计时的注册页面
Jan 02 #Javascript
使用socket.io实现简单聊天室案例
Jan 02 #Javascript
使用socket.io制做简易WEB聊天室
Jan 02 #Javascript
AngularJS实现的简单拖拽功能示例
Jan 02 #Javascript
You might like
php数组的概述及分类与声明代码演示
2013/02/26 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
2015/07/06 PHP
3种php生成唯一id的方法
2015/11/23 PHP
php 如何禁用eval() 函数实例详解
2016/12/01 PHP
客户端脚本中常常出现的一些问题和调试技巧
2007/01/09 Javascript
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
JavaScript 变量基础知识
2009/11/07 Javascript
Google Map V3 绑定气泡窗口(infowindow)Dom事件实现代码
2013/04/26 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
Javascript数组与字典用法分析
2014/12/13 Javascript
jQuery实现为图片添加镜头放大效果的方法
2015/06/25 Javascript
webpack入门必知必会
2017/01/16 Javascript
jQuery实现简单弹窗遮罩效果
2017/02/27 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
Vue.js弹出模态框组件开发的示例代码
2017/07/26 Javascript
[原创]jQuery实现合并/追加数组并去除重复项的方法
2018/04/11 jQuery
vue组件name的作用小结
2018/05/23 Javascript
使用vue-router beforEach实现判断用户登录跳转路由筛选功能
2018/06/25 Javascript
python正则表达式判断字符串是否是全部小写示例
2013/12/25 Python
Python中for循环控制语句用法实例
2015/06/02 Python
python3处理含有中文的url方法
2018/05/10 Python
Python os.rename() 重命名目录和文件的示例
2018/10/25 Python
基于MSELoss()与CrossEntropyLoss()的区别详解
2020/01/02 Python
Tensorflow 多线程设置方式
2020/02/06 Python
Python实现在Windows平台修改文件属性
2020/03/05 Python
PyQt5 控件字体样式等设置的实现
2020/05/13 Python
世界上最好的精品店:Shoptiques
2018/02/05 全球购物
微软加拿大官方网站:Microsoft Canada
2019/04/28 全球购物
美国浴缸、水槽和水龙头购物网站:Vintage Tub & Bath
2019/11/05 全球购物
介绍一下OSI七层模型
2012/07/03 面试题
车间组长岗位职责
2013/12/20 职场文书
八一建军节感言
2014/02/28 职场文书
预备党员学习十八届三中全会精神思想汇报
2014/09/13 职场文书
家长评语怎么写
2014/12/30 职场文书
2016年企业先进员工事迹材料
2016/02/25 职场文书
SQL Server连接查询的实用教程
2021/04/07 SQL Server