vue-cli是由vue官方发布的快速构建vue单页面的脚手架。

使用 vue-cli构建的项目,在 默认情况下 ,执行 npm run build 会将所有的js代码打包为一个整体,

打包位置是 dist/static/js/app.[contenthash].js

类似下面的路由代码

router/index.js 路由相关信息,该路由文件引入了多个 .vue组件

import Hello from '@/components/Hello'

import Province from '@/components/Province'

import Segment from '@/components/Segment'

import User from '@/components/User'

import Loading from '@/components/Loading'

执行 npm run build 会打包为一个整体 app.[contenthash].js ,这个文件是非常大,可能几兆或者几十兆,加载会很慢

所以我们需要分模块打包,把我们想要组合在一起的组件打包到一个 chunk块中去,分模块打包需要下面这样使用 webpack的 require.ensure,并且在最后加入一个 chunk名,相同 chunk名字的模块将会打包到一起。

webpack中利用require.ensure()实现按需加载

1、require.ensure()

webpack 在编译时,会静态地解析代码中的 require.ensure(),同时将模块添加到一个分开的 chunk 当中。这个新的 chunk 会被 webpack 通过 jsonp 来按需加载。

语法如下:

require.ensure(dependencies: String[], callback: function(require), chunkName: String)

依赖 dependencies

这是一个字符串数组,通过这个参数,在所有的回调函数的代码被执行前,我们可以将所有需要用到的模块进行声明。

回调 callback

当所有的依赖都加载完成后,webpack会执行这个回调函数。require 对象的一个实现会作为一个参数传递给这个回调函数。因此,我们可以进一步 require() 依赖和其它模块提供下一步的执行。

chunk名称 chunkName

chunkName 是提供给这个特定的 require.ensure() 的 chunk 的名称。通过提供 require.ensure() 不同执行点相同的名称,我们可以保证所有的依赖都会一起放进相同的 文件束(bundle)。

让我们来看以下的项目

\\ file structure

|

js --|

| |-- entry.js

| |-- a.js

| |-- b.js

webpack.config.js

|

dist

\\ entry.js

require('a');

require.ensure([], function(require){

require('b');

});

\\ a.js

console.log('***** I AM a *****');

\\ b.js

console.log('***** I AM b *****');

\\ webpack.config.js

var path = require('path');

module.exports = function(env) {

return {

entry: './js/entry.js',

output: {

filename: 'bundle.js',

path: path.resolve(__dirname, 'dist')

}

}

}

通过执行这个项目的 webpack 构建,我们发现 webpack 创建了2个新的文件束, bundle.js 和 0.bundle.js。

entry.js 和 a.js 被打包进 bundle.js.

b.js 被打包进 0.bundle.js.

2、require.ensure() 的坑点

(1)、空数组作为参数

require.ensure([], function(require){

require('./a.js');

});

以上代码保证了拆分点被创建,而且 a.js 被 webpack 分开打包。

(2)、依赖作为参数

require.ensure(['./a.js'], function(require) {

require('./b.js');

});

上面代码, a.js 和 b.js 都被打包到一起,而且从主文件束中拆分出来。但只有 b.js 的内容被执行。a.js 的内容仅仅是可被使用,但并没有被输出。

想去执行 a.js,我们需要异步地引用它,如 require(‘./a.js'),让它的 JavaScritp 被执行。

(3)、单独打包成自己写的名字配置

需要配置chunkFilename,和publicPath。publicPath是按需加载单独打包出来的chunk是以publicPath会基准来存放的,chunkFilename:[name].js这样才会最终生成正确的路径和名字

module.exports={

entry:'./js/entry.js',

output:{

path:path.resolve(__dirname,"./dist"),

filename:'js/a.bundle.js',

publicPath:"./",

chunkFilename:'js/[name].js'

}

所以router/index.js 修改为懒加载组件:

const Province = r => require.ensure([], () => r(require('@/components/Province.vue')), 'chunkname1')

const Segment = r => require.ensure([], () => r(require('@/components/Segment.vue')), 'chunkname2')

const Loading = r => require.ensure([], () => r(require('@/components/Loading.vue')), 'chunkname3')

const User = r => require.ensure([], () => r(require('@/components/User.vue')), 'chunkname3')

根据 chunkame的不同, 上面的四个组件, 将会被分成3个块打包,最终打包之后与组件相关的js文件会分为3个 (除了app.js,manifest.js, vendor.js)

分模块打包之后在 dist目录下是这样的, 这样就把一个大的 js文件分为一个个小的js文件了,按需去下载,其他的使用方法和import的效果一样

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

ensure函数_vue按需加载组件webpack require.ensure的方法相关推荐

  1. vue按需加载组件-webpack require.ensure(转)

    vue按需加载组件-webpack require.ensure 2017年07月28日 09:58:07 A_山水子农 阅读数:23245 标签: vue按需加载组件按需加载webpackrequi ...

  2. webpack和vue的按需加载组件、console、抓包

    1.webpack和vue的按需加载组件 webpack特有的懒加载文件的方式,很大的提升了webpack打包SPA应用的在性能方面. 而从webpack2以后require.ensure已经被imp ...

  3. vue项目优化之按需加载组件-使用webpack require.ensure

    使用 vue-cli构建的项目,在 默认情况下 ,执行 npm run build  会将所有的js代码打包为一个整体, 打包位置是 dist/static/js/app.[contenthash]. ...

  4. ant-design如果按需加载组件

    Ant Design React按需加载 Ant Design是阿里巴巴为React做出的组件库,有统一的样式及一致的用户体验 官网地址:https://ant.design 1.安装: npm in ...

  5. vue按需加载组件_微人事首页加载速度提高了 5 倍,我都做了什么?

    「本文之前发过,但是比较零散,这里我把用到的方案都汇总一下,方便大家索引,有需要的小伙伴可以收藏下方便查找.里边提到的几种方案,大家都可以对照着视频试一下」 ElementUI 按需加载: 服务端开启 ...

  6. react --- 按需加载组件

    问题描述 使用 antd库时 使用按钮,须导入如下 import Button from 'antd/lib/button' import 'antd/dist/antd.css' 这样会导入全局的样 ...

  7. ensure函数_webpack中利用require.ensure()实现按需加载

    webpack中的require.ensure()可以实现按需加载资源包括js,css等,它会给里面require的文件单独打包,不和主文件打包在一起,webpack会自动配置名字,如0.js,1.j ...

  8. ensure函数_webpack中require.ensure()实现按需加载

    webpack中的require.ensure()可以实现按需加载资源包括js,css等,它会给里面require的文件单独打包,不和主文件打包在一起,webpack会自动配置名字,如0.js,1.j ...

  9. antd 按需加载,antd定制主题,antd上传组件,在线换肤

    antd 按需加载组件,antd按需加载样式 使用 babel-plugin-import,babel模块化导入插件,兼容antd,antd-mobile,lodash等库 配置:{ "li ...

  10. react按需加载(getComponent优美写法),并指定输出模块名称解决缓存(getComponent与chunkFilename)...

    react配合webpack进行按需加载的方法很简单,Route的component改为getComponent,组件用require.ensure的方式获取,并在webpack中配置chunkFil ...

最新文章

  1. 地表最强VLP模型!谷歌大脑和CMU提出极简弱监督模型
  2. 软件工程--团队作业4
  3. 输入法图标也会莫名其妙地丢失?
  4. 中小型企业如何选择服务器配置?
  5. 互联网1分钟 |1213
  6. MySQL修改字符集
  7. leetcode516. 最长回文子序列(动态规划)
  8. 2019阿里云618大促主会场全攻略
  9. qt连接mysql4.7数据库_QT4.7访问MySQL的驱动编译过程
  10. 移动硬盘拒绝访问找到数据的法子
  11. opencv双线程图片处理_打开正经图片,你可能会看到一张黄图,这种造假方法能同时骗过 AI 和人眼...
  12. 【数字信号处理】基于matlab数字信号同步压缩变换【含Matlab源码 1535期】
  13. 【转】What is an entity system framework for game development?
  14. PDF可以转换成CAD图纸吗?
  15. 干货!一文带你认清SD卡、TF卡、SIM卡!
  16. 一个有意思的需求——中文匹配度
  17. Matplotlib——散点图_多种自定义
  18. 数分笔记整理21 - 数据处理项目 - 城市餐饮店铺选址分析 电商打折套路解析
  19. C++ 使用智能指针shared_ptr/unique_ptr管理数组
  20. C++后台开发,以我之见

热门文章

  1. 对此人的嚣张你们怎么看
  2. CSS3之3D效果中的transform运用
  3. 汇编语言-学习笔记(一)
  4. 中国邮政支付宝卡通开通流程
  5. BizTalk 2002:Registering Custom Components
  6. Jmeter多机联合产生负载 (转)
  7. web安全day44:进阶,使用Nmap+Wireshark理解端口扫描
  8. web安全day6:IIS之WEB服务器
  9. linux 脚本 ps grep,linux中PS命令和grep命令以及信号处理函数
  10. java 多线程之间通信_java多线程之间的通信