webpack中的Code Splitting

Code Splitting是什么以及为什么

在以前,为了减少HTTP请求,通常地,我们会把所有的代码都打包成一个单独的JS文件,但是,如果这个文件体积很大的时候,就得不偿失了。

这时,我们不妨把所有代码分成一块一块,需要某块代码的时候,再去加载它,还可以利用浏览器的缓存,下次用到它的时候,直接从缓存中读取。

所以说,Code Splitting其实是把代码分成很多很多块(chunk)

Code Splitting怎么做?

主要有2种方式:

分离业务代码和第三方库(vender)

按需加载(使用import())方法

之所以把业务代码和第三方库代码分离出来,是因为产品经理的需求是源源不断的,因此业务代码更新频率大,相反第三方库代码更新迭代相对较慢且可以

锁版本,所以可以充分利用浏览器的缓存来加载这些第三方库。

而按需加载的适用场景,比如说【访问某个路由的时候再去加载对应的组件】,用户不一定会访问所有的组件,

所以没必要把所有路由对应的组件都在开始的加载完,更典型的例子是【某些用户的权限只能访问某些页面】,没必要把他们没权限访问的页面的代码也加载

分离业务代码和第三方库的方法:

在webpack.base.conf.js里面添加上面的代码

这时打包后会出现一个问题,vendor,js和app.js会包含公共的代码,这时需要使用webpack的CommonsChunkPlugin插件(使用webpack构建vue项目的时候,webpack.prod.conf.js里面就有这个插件),

webpack.prod.conf.js里面的代码

备注:有new webpack.optimize.CommonsChunkPlugin,在webpack.base.conf.js的entry里面就不需要添加vendor了

因为有上面的代码,webpack就会自动判断模块是否来自node_modules里面,且名字是以js结尾。如果是:就把他们移动到vendor chunk里去,如果vendor chunk

不存在的话,就创建一个新的

  1. // split vendor js into its own file
  2. new webpack.optimize.CommonsChunkPlugin({
  3. name: 'vendor',
  4. minChunks: function (module, count) {
  5. // any required modules inside node_modules are extracted to vendor
  6. return (
  7. module.resource &&
  8. /\.js$/.test(module.resource) &&
  9. module.resource.indexOf(
  10. path.join(__dirname, '../node_modules')
  11. ) ===
  12. )
  13. }
  14. }),
  15. // extract webpack runtime and module manifest to its own file in order to
  16. // prevent vendor hash from being updated whenever app bundle is updated
  17. new webpack.optimize.CommonsChunkPlugin({
  18. name: 'manifest',
  19. chunks: ['vendor']
  20. }),
  21. // copy custom static assets
  22. new CopyWebpackPlugin([
  23. {
  24. from: path.resolve(__dirname, '../static'),
  25. to: config.build.assetsSubDirectory,
  26. ignore: ['.*']
  27. }
  28. ])

要想在打包以后,可以查看打包文件,需要用到webpack的webpack-bundle-analyzer插件,使用方法是:

链接:https://www.npmjs.com/package/webpack-bundle-analyzer

先安装npm install --save-dev webpack-bundle-analyzer

然后在 webpack.config.js:

  1. var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
  1.  
  2. 1 plugins: [
  3. new BundleAnalyzerPlugin({
  4. // Can be `server`, `static` or `disabled`.
  5. // In `server` mode analyzer will start HTTP server to show bundle report.
  6. // In `static` mode single HTML file with bundle report will be generated.
  7. // In `disabled` mode you can use this plugin to just generate Webpack Stats JSON file by setting `generateStatsFile` to `true`.
  8. analyzerMode: 'server',
  9. // Host that will be used in `server` mode to start HTTP server.
  10. analyzerHost: '127.0.0.1',
  11. // Port that will be used in `server` mode to start HTTP server.
  12. analyzerPort: ,
  13. // Path to bundle report file that will be generated in `static` mode.
  14. // Relative to bundles output directory.
  15. reportFilename: 'report.html',
  16. // Module sizes to show in report by default.
  17. // Should be one of `stat`, `parsed` or `gzip`.
  18. // See "Definitions" section for more information.
  19. defaultSizes: 'parsed',
  20. // Automatically open report in default browser
  21. openAnalyzer: true,
  22. // If `true`, Webpack Stats JSON file will be generated in bundles output directory
  23. generateStatsFile: false,
  24. // Name of Webpack Stats JSON file that will be generated if `generateStatsFile` is `true`.
  25. // Relative to bundles output directory.
  26. statsFilename: 'stats.json',
  27. // Options for `stats.toJson()` method.
  28. // For example you can exclude sources of your modules from stats file with `source: false` option.
  29. // See more options here: https://github.com/webpack/webpack/blob/webpack-1/lib/Stats.js#L21
  30. statsOptions: null,
  31. // Log level. Can be 'info', 'warn', 'error' or 'silent'.
  32. logLevel: 'info'
  33. })
  34. ]

使用npm run build以后,效果是:

按需加载的方法:

第一步:

  1. 引入组件的地方把impot改成=>
  2. import Emoli from '../pages/Emoli'
  3.  
  4. 改成
  5.  
  6. const Emoli = () => import('../pages/Emoli')

第二步:

这样就可以跳转到相应的组件,才会加载相应的组件

除了把import改成 => ,还可以用require

链接:http://www.cnblogs.com/Kummy/p/5254754.html

vue系列之项目优化的更多相关文章

  1. vue系列之项目打包

    vue完成项目后,如何打包成静态文件,并且用Node调试 打包 1.修改config里面的index.js里面的productionSourceMap为false,默认情况是true(true代表打包 ...

  2. 大型vue单页面项目优化总结

    这是之前在公司oa项目优化时罗列的优化点,基本都已经完成,当时花了点心思整理的,保存在这里,方便以后其他项目用到查漏补缺. 1.打包文件中的app.js文件放入cdn,加快页面首次加载速度 2.提取公 ...

  3. vue系列之项目结构

    参考地址:链接 build webpack配置相关 config webpack配置相关 node_modules  npm install 安装的依赖代码库 src  存放项目源码 static 存 ...

  4. Vue实战Vue-cli项目构建(Vue+webpack系列之一)

    用Vue比较长一段时间了,大大小小做了一些项目,最近想总结一下知识点,出一个Vue+webpack系列,先从项目构建说起--vue-cli. 由于是Vue+webpack这里就不赘述git那些东西,默 ...

  5. vue单页面应用项目优化总结(转载)

    转载自:https://blog.csdn.net/qq_42221334/article/details/81907901这是之前在公司oa项目优化时罗列的优化点,基本都已经完成,当时花了点心思整理 ...

  6. 前端项目优化 -Web 开发常用优化方案、Vue & React 项目优化

    github github-myBlob 从输入URL到页面加载完成的整个过程 首先做 DNS 查询,如果这一步做了智能 DNS 解析的话,会提供访问速度最快的 IP 地址回来 接下来是 TCP 握手 ...

  7. vue+webpack+element-ui项目打包优化速度与app.js、vendor.js打包后文件过大

    从开通博客到现在也没写什么东西,最近几天一直在研究vue+webpack+element-ui项目打包速度优化,想把这几天的成果记录下来,可能对前端牛人来说我这技术比较菜,但还是希望给有需要的朋友提供 ...

  8. almost最好的Vue + Typescript系列02 项目结构篇

    基于vue-cli 3.x,配合typescript的环境构建的新vue项目,跟以前的结构相比,有了一些变化,下面我们来简单的了解一下 基本结构: node_modules: 项目中安装的依赖模块 p ...

  9. vue项目优化与上线

    一.项目优化策略 1.生成打包报告 2.第三方库启用CDN 3.Element-ui组件按需加载 4.首页内容定制 5.路由懒加载 1.生成打包报告 1.1通过vue-cli的UI面板直接查看 1.2 ...

随机推荐

  1. BZOJ1495 [NOI2006]网络收费 【树形dp + 状压dp】

    题目链接 BZOJ1495 题解 观察表格,实际上就是分\(A\)多和\(B\)两种情况,分别对应每个点选\(A\)权值或者\(B\)权值,所以成对的权值可以分到每个点上 所以每个非叶节点实际对应一个 ...

  2. Monitor WMIExportsToC++Use DiskCleanup bypass UAC

    作者:嘶吼吼链接:https://zhuanlan.zhihu.com/p/23473665来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. About: Use odb ...

  3. rsync命令比对文件及增量同步

    A fast,versatile,remote (and local) file-copying tool. rsync基于ssh协议实现高效率远程或本地文件复制,传输速度比scp快.复制文件时会比对 ...

  4. 解决Android SDK Manager更新时出现问题

    使用SDK Manager更新时出现问题Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-6.xm ...

  5. centos详细安装redis步骤

    1. 从官网(http://redis.io)下载最新稳定版2. 使用命令解压下载的tar包:tar –zxvf redis-3.2.0.tar.gz3. 通过命令cd redis-3.2.0进入源码 ...

  6. SIFT算法学习

    几个关于SIFT算法的blog,写的很好,链接学习一下 小北的家谈谈SIFT.PCA-SIFT.SURF及我的一点思考http://blog.csdn.net/ijuliet/article/deta ...

  7. 编译geth报错的解决方法 make: *** [geth] 错误 1

    在centos下安装了go1.9.1版本,编译go-ethereum时报错: [root@localhost go-ethereum]# make gethbuild/env.sh go run bu ...

  8. openssl md5 sha256 rsa des

    原文地址找不到了 #include <windows.h>#include <iostream>#include <cassert> #include <st ...

  9. 数据分析与展示---Pandas库入门

    简介 一:Pandas库的介绍 二:Pandas库的Series类型 (一)索引 (1)自动索引 (2)自定义索引 (二)Series类型创建 (1)列表创建 (2)标量值创建 (3)字典类型创建(将 ...

  10. vue 项目代码初始化

    1. <meta>补充 <head> <meta charset="utf-8"> <meta name="viewport&q ...