使用Webpack提高Vue.js应用的方式汇总(四种)


Posted in Javascript onJuly 10, 2017

Webpack是开发Vue.js单页应用程序的重要工具。 通过管理复杂的构建步骤,你可以更轻松地开发工作流程,并优化应用程序的大小和性能。

其中介绍下面四种方式:

  1. 单个文件组件
  2. 优化Vue构建
  3. 浏览器缓存管理
  4. 代码分割 

1.单个文件组件

Vue的特殊功能之一是使用HTML作为组件模板。 尽管如此,它们还有一个内在的问题:你的HTML标记需要是一个尴尬的JavaScript字符串,

否则你的模板和组件定义将需要在单独的文件中,使其难以使用。

Vue有一个优雅的解决方案,称为单文件组件(SFC),其中包括模板,组件定义和CSS全部在一个整齐的.vue文件中:

如下模块mycomponent.vue(html +js +css)

<template>
 <div id="my-component">...</div>
</template>
<script>
 export default {...}
</script>
<style>
 #my-component {...}
</style>

SFC通过vue-loader Webpack插件实现。 这个装载器将SFC的语言块和管道分成一个适当的装载器,例如 脚本块转到babel-loader,而模板块转到Vue自己的vue-template-loader,

将模板转换为JavaScript渲染功能。

vue-loader的最终输出是一个可以包含在Webpack包中的JavaScript模块。

vue-loader的典型配置如下:(webpack.base.conf.js)

module: {
 rules: [
  {
   test: /\.vue$/,
   loader: 'vue-loader',
   options: {
    loaders: {
     // Override the default loaders
    }
   }
  },
 ]
}

 2. 优化Vue构建--运行时版本构建

如果你仅在Vue应用程序*中使用渲染功能,并且没有HTML模板,则不需要Vue的模板编译器。 你可以通过从Webpack构建中省略编译器来减少捆绑包大小。

*记住,单个文件组件模板是在开发中预编译的,以渲染功能!

Vue.js库中只有一个运行时版本的构建,其中包含Vue.js除了模板编译器(称为vue.runtime.js)之外的所有功能。 它比完整版小约20KB,所以值得使用,如果可以的话。

默认情况下使用运行时版本,因此每次使用“vue”的import vue 来引入需要的文件;

通过起别名来简化文件中繁琐的路径引用:(webpack.base.conf.js)

resolve: {
 alias: {
  'vue$': 'vue/dist/vue.esm.js' // Use the full build
 }
},

 剥离生产中的警告和错误消息

减少Vue.js构建大小的另一种方法是删除生产中的任何错误消息和警告。 去掉不必要的代码减少输出捆绑包大小

我们可以这样设置:只在生产环境中添加这些警告

if (process.env.NODE_ENV !== 'production') {
 warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm);
}

如果process.env.NODE_ENV设置为生产,那么在构建过程中,这些警告块可以通过分解器自动从代码中删除。

你可以使用DefinePlugin设置process.env.NODE_ENV的值,并使用UglifyJsPlugin来缩小代码并将未使用的块删除:

if (process.env.NODE_ENV === 'production') {
 module.exports.plugins = (module.exports.plugins || []).concat([
  new webpack.DefinePlugin({
   'process.env': {
    NODE_ENV: '"production"'
   }
  }),
  new webpack.optimize.UglifyJsPlugin()
 ])
}

3. 浏览器缓存管理

用户的浏览器将缓存你的站点的文件

 如果所有的代码都在一个文件中,那么一个微小的变化将意味着整个文件将需要重新下载。

理想情况下,你希望用户尽可能少的下载,因此在你的应用程序中将很少更改的代码和频繁更改的代码分开处理会更好

 3.1 Vendor 文件

这个Common Chunks插件可以从你的应用程序代码(可能在每个部署中更改的代码)解耦你的vendor 代码(例如,Vue.js库)。

你可以查看依赖项是否来自node_modules文件夹,如果是,则将其输出到单独的文件vendor.js中:

new webpack.optimize.CommonsChunkPlugin({
 name: 'vendor',
 minChunks: function (module) {
  return module.context && module.context.indexOf('node_modules') !== -1;
 }
})

最后在构建输出中有两个单独的文件,这些文件将由浏览器独立缓存:

<script src="vendor.js" charset="utf-8"></script>
<script src="app.js" charset="utf-8"></script>

 3.2 Fingerprinting

构建文件发生变化时,我们如何修改浏览器的缓存?

默认情况下,只有当缓存文件过期时,或者当用户手动清除缓存时,浏览器将再次从服务器请求该文件。 如果服务器指示文件已更改,则文件将被重新下载(否则服务器返回HTTP 304未修改)。

为了保存不必要的服务器请求,我们可以在每次内容更改时更改文件的名称,以强制浏览器重新下载。 这样做的一个简单系统是通过附加一个哈希来为文件名添加一个“fingerprint”,例如:

使用Webpack提高Vue.js应用的方式汇总(四种)

 

Common Chunks插件发出一个“chunkhash”,如果文件的内容已经更改,它将被更新。 当它们输出时,Webpack可以将这个哈希追加到文件名中:

output: {
 filename: '[name].[chunkhash].js'
},

当你这样做时,你会看到你输出的文件将具有像app.3b80b7c17398c31e4705.js这样的名称。

 3.3 自动注入构建文件

当然,如果你添加一个哈希,你必须更新索引文件中的文件的引用,否则浏览器将不会知道它:

<script src="app.3b80b7c17398c31e4705.js"></script>

这将是一个非常繁琐的工作,手动执行,所以使用HTML Webpack插件为你做。 该插件可以在捆绑过程中自动将构建文件的引用注入到HTML文件中。

首先删除对构建文件的引用:(index.html)

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title>test-6</title>
 </head>
 <body>
  <div id="app"></div>
  <!-- built files should go here, but will be auto injected -->
 </body>
</html>

并将HTML Webpack Plugin添加到Webpack config中:

new HtmlWebpackPlugin({
 filename: 'index.html'
 template: 'index.html',
 inject: true,
 chunksSortMode: 'dependency'
}),

这样配置完成之后在index.html中就会自动引用构建的文件

4.代码分割

默认情况下,Webpack会将你的所有应用程序代码输出为一个大捆绑文件。 但是,如果你的应用程序有多个页面,则使用分割代码将更有效,

每个单独的页面代码都在单独的文件中,并且仅在需要时加载是更好的选择。

Webpack有一个名为“代码分割”的功能,正是这样。 在Vue.js中实现这一点也需要异步组件,并且通过Vue Router变得更加容易。

  4.1 异步组件

异步组件不是将定义对象作为其第二个参数,而是具有解析定义对象的Promise函数,例如:

Vue.component('async-component', function (resolve, reject) {
 setTimeout(() => {
  resolve({
   // Component definition including props, methods etc.
  });
 }, 1000)
})

当组件实际需要呈现时,Vue将只调用该函数。 它还将缓存未来重新渲染的结果。

如果我们构建我们的应用程序,因此每个“页面”都是一个组件,并且我们将定义存储在我们的服务器上,那么我们就是中断实现代码分割的途径。

 

4.2 require要求

要从服务器加载异步组件的代码,请使用Webpack require语法。 这将指示Webpack在构建时将单独的软件包中的async组件捆绑在一起,

而且更好的是,Webpack将使用AJAX处理此捆绑包的加载,因此你的代码可以简单如下:

Vue.component('async-component', function (resolve) {
 require(['./AsyncComponent.vue'], resolve)
});

4.3 懒加载 (router.js)

在路由配置文件中一般的都是直接导入比如

import HomePage from './HomePage '

如果想路由页面只在用到时候加载可以修改如下

const HomePage = resolve => require(['./HomePage.vue'], resolve);
const rounter = new VueRouter({
 routes: [
  {
   path: '/',
   name: 'HomePage',
   component: HomePage
  }
 ]
})

以上所述是小编给大家介绍的使用Webpack提高Vue.js应用的方式汇总(四种),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
接收键盘指令的脚本
Jun 26 Javascript
用Javascript实现锚点(Anchor)间平滑跳转
Sep 08 Javascript
javascript 窗口加载蒙板 内嵌网页内容
Nov 19 Javascript
一个关于javascript匿名函数的问题分析
Mar 30 Javascript
JS实现控制表格只显示行边框或者只显示列边框的方法
Mar 31 Javascript
JSON字符串转换JSONObject和JSONArray的方法
Jun 03 Javascript
Jquery Easyui分割按钮组件SplitButton使用详解(17)
Dec 18 Javascript
easyUI实现类似搜索框关键词自动提示功能示例代码
Dec 27 Javascript
原生JS实现在线问卷调查投票特效
Jan 03 Javascript
vue.js中父组件调用子组件的内部方法示例
Oct 22 Javascript
在vue中,v-for的索引index在html中的使用方法
Mar 06 Javascript
javascript读取本地文件和目录方法详解
Aug 06 Javascript
在vue中获取dom元素内容的方法
Jul 10 #Javascript
jQuery实现html table行Tr的复制、删除、计算功能
Jul 10 #jQuery
vue移动端裁剪图片结合插件Cropper的使用实例代码
Jul 10 #Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
Jul 10 #Javascript
Javascript调试之console对象——你不知道的一些小技巧
Jul 10 #Javascript
vue实现表格数据的增删改查
Jul 10 #Javascript
激动人心的 Angular HttpClient的源码解析
Jul 10 #Javascript
You might like
采用header定义为文件然后readfile下载(隐藏下载地址)
2014/01/31 PHP
PHP将session信息存储到数据库的类实例
2015/03/04 PHP
yii框架无限极分类的实现方法
2017/04/08 PHP
google地图的路线实现代码
2009/08/20 Javascript
JQuery 引发两次$(document.ready)事件
2010/01/15 Javascript
javascript 学习笔记(八)javascript对象
2011/04/12 Javascript
javascript结合html5 canvas实现(可调画笔颜色/粗细/橡皮)的涂鸦板
2013/04/27 Javascript
javascript获取所有同类checkbox选项(实例代码)
2013/11/07 Javascript
JS弹出层单纯的绝对定位居中示例代码
2014/02/18 Javascript
移动Web中图片自适应的两种JavaScript解决方法
2015/06/18 Javascript
浅谈jQuery中hide和fadeOut的区别 show和fadeIn的区别
2016/08/18 Javascript
自动适应iframe右边的高度
2016/12/22 Javascript
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
原生js实现Flappy Bird小游戏
2018/12/24 Javascript
微信小程序的注册页面包含倒计时验证码、获取用户信息
2019/05/22 Javascript
在Chrome DevTools中调试JavaScript的实现
2020/04/07 Javascript
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
使用python实现生成用户信息
2017/03/20 Python
解决python os.mkdir创建目录失败的问题
2018/10/16 Python
C语言基础笔试题
2013/04/27 面试题
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
数控专业毕业生求职信范文
2013/09/21 职场文书
银行实习自我鉴定
2013/10/12 职场文书
企划经理的岗位职责
2013/11/17 职场文书
餐饮业经理竞聘演讲稿
2014/01/14 职场文书
2014迎新年晚会策划方案
2014/02/23 职场文书
毕业班联欢会主持词
2014/03/27 职场文书
《画风》教学反思
2014/04/16 职场文书
绿色环保演讲稿
2014/05/10 职场文书
廉洁校园实施方案
2014/05/25 职场文书
乡镇爱国卫生月活动总结
2014/06/25 职场文书
设备技术员岗位职责
2015/04/11 职场文书
整脏治乱工作简报
2015/07/21 职场文书
anaconda python3.8安装后降级
2021/06/11 Python
Java org.w3c.dom.Document 类方法引用报错
2021/08/07 Java/Android
TypeScript中条件类型精读与实践记录
2021/10/05 Javascript