webpack打包懒加载
lazyload
https://webpack.js.org/guides/lazy-loading/
懒加载 -- 按需加载。
Lazy, or "on demand", loading is a great way to optimize your site or application. This practice essentially involves splitting your code at logical breakpoints, and then loading it once the user has done something that requires, or will require, a new block of code. This speeds up the initial load of the application and lightens its overall weight as some blocks may never even be loaded.
webpack solution
https://webpack.js.org/migrate/3/#code-splitting-with-es2015
Code Splitting with ES2015
In webpack 1, you could use
require.ensure()as a method to lazily-load chunks for your application:require.ensure([], function(require) {
var foo = require('./module');
});The ES2015 Loader spec defines
import()as method to load ES2015 Modules dynamically on runtime. webpack treatsimport()as a split-point and puts the requested module in a separate chunk.import()takes the module name as argument and returns a Promise.function onClick() {
import('./module').then(module => {
return module.default;
}).catch(err => {
console.log('Chunk loading failed');
});
}Good news: Failure to load a chunk can now be handled because they are
Promise
require.ensure
https://webpack.js.org/api/module-methods/#requireensure
require.ensure()is specific to webpack and superseded byimport().require.ensure(
dependencies: String[],
callback: function(require),
errorCallback: function(error),
chunkName: String
)Split out the given
dependenciesto a separate bundle that that will be loaded asynchronously. When using CommonJS module syntax, this is the only way to dynamically load dependencies. Meaning, this code can be run within execution, only loading thedependenciesif certain conditions are met.This feature relies on
Promiseinternally. If you userequire.ensurewith older browsers, remember to shimPromiseusing a polyfill such as es6-promise or promise-polyfill.var a = require('normal-dep'); if ( module.hot ) {
require.ensure(['b'], function(require) {
var c = require('c'); // Do something special...
});
}The following parameters are supported in the order specified above:
dependencies: An array of strings declaring all modules required for the code in thecallbackto execute.callback: A function that webpack will execute once the dependencies are loaded. An implementation of therequirefunction is sent as a parameter to this function. The function body can use this to furtherrequire()modules it needs for execution.errorCallback: A function that is executed when webpack fails to load the dependencies.chunkName: A name given to the chunk created by this particularrequire.ensure(). By passing the samechunkNameto variousrequire.ensure()calls, we can combine their code into a single chunk, resulting in only one bundle that the browser must load.Although the implementation of
requireis passed as an argument to thecallbackfunction, using an arbitrary name e.g.require.ensure([], function(request) { request('someModule'); })isn't handled by webpack's static parser. Userequireinstead, e.g.require.ensure([], function(require) { require('someModule'); }).
import()
import('path/to/module') -> PromiseDynamically load modules. Calls to
import()are treated as split points, meaning the requested module and it's children are split out into a separate chunk.The ES2015 Loader spec defines
import()as method to load ES2015 modules dynamically on runtime.if ( module.hot ) {
import('lodash').then(_ => {
// Do something with lodash (a.k.a '_')...
});
}This feature relies on
Promiseinternally. If you useimport()with older browsers, remember to shimPromiseusing a polyfill
require (amd-version)
https://webpack.js.org/api/module-methods/#require-amd-version
require(dependencies: String[], [callback: function(...)])Similar to
require.ensure, this will split the givendependenciesinto a separate bundle that will be loaded asynchronously. Thecallbackwill be called with the exports of each dependency in thedependenciesarray.This feature relies on
Promiseinternally. If you use AMD with older browsers (e.g. Internet Explorer 11), remember to shimPromiseusing a polyfill such as es6-promise or promise-polyfill.require(['b'], function(b) {
var c = require('c');
});There is no option to provide a chunk name.
external NPM module -- bundle-loader
https://www.npmjs.com/package/bundle-loader
https://github.com/ruanyf/webpack-demos#demo08-html-webpack-plugin-and-open-browser-webpack-plugin-source
Another way of code splitting is using bundle-loader.
// main.js // Now a.js is requested, it will be bundled into another file
var load = require('bundle-loader!./a.js'); // To wait until a.js is available (and get the exports)
// you need to async wait for it.
load(function(file) {
document.open();
document.write('<h1>' + file + '</h1>');
document.close();
});
require('bundle-loader!./a.js')tells Webpack to loada.jsfrom another chunk.Now Webpack will build
main.jsintobundle.js, anda.jsinto0.bundle.js.
others lazy load
https://webpack.js.org/guides/lazy-loading/
Frameworks
Many frameworks and libraries have their own recommendations on how this should be accomplished within their methodologies. Here are a few examples:
reference:
https://github.com/amdjs/amdjs-api
https://github.com/yongningfu/webpa_ensure
https://github.com/yongningfu/webpack_package
webpack打包懒加载的更多相关文章
- 「Vue.js」Vue-Router + Webpack 路由懒加载实现
一.前言 当打包构建应用时,Javascript 包会变得非常大,影响页面加载.如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了.结合 Vue ...
- vue+webpack 实现懒加载的三种方式
第一种: 引入方式 就是正常的路由引入方式 const router = new Router({ routes: [ { path: '/hyh', component: hyh, name: 'h ...
- vue-cli webpack打包后加载资源的路径问题
vue项目,访问打包后的项目,输入路径后,页面加载空白.这时会有两类问题,都是路径问题. 1.一个是css,js,ico等文件加载不到,是目录里少了dist 打开页面时一片空白 解决办法: confi ...
- 在webpack中使用Code Splitting--代码分割来实现vue中的懒加载
当Vue应用程序越来越大,使用Webpack的代码分割来懒加载组件,路由或者Vuex模块, 只有在需要时候才加载代码. 我们可以在Vue应用程序中在三个不同层级应用懒加载和代码分割: 组件,也称为异步 ...
- webpack多页面开发与懒加载hash解决方案
之前讨论了webpack的hash与chunkhash的区别以及各自的应用场景,如果是常规单页面应用的话,上篇文章提供的方案是没有问题的.但是前端项目复杂多变,应对复杂多页面项目时,我们不得不继续踩w ...
- vue 组件按需引用,vue-router懒加载,vue打包优化,加载动画
当打包构建应用时,Javascript 包会变得非常大,影响页面加载.如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了. 结合 Vue 的 异步 ...
- webpack学习笔记—优化缓存、合并、懒加载等
除了前面的webpack基本配置,还可以进一步添加配置,优化合并文件,加快编译速度.下面是生产环境配置文件webpack.production.js,与wenbpack.config.js相比其不需要 ...
- vue2.x 路由懒加载 优化打包体积
当打包构建应用时,Javascript 包会变得非常大,影响页面加载.如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了. 结合 Vue 的异步组 ...
- Webpack探索【16】--- 懒加载构建原理详解(模块如何被组建&如何加载)&源码解读
本文主要说明Webpack懒加载构建和加载的原理,对构建后的源码进行分析. 一 说明 本文以一个简单的示例,通过对构建好的bundle.js源码进行分析,说明Webpack懒加载构建原理. 本文使用的 ...
随机推荐
- Redis基础一(Linux)
Redis概述 1.是一个开源的,先进的<key,value>存储,并用与构建高性能,可扩展的应用程序的完美解决方案 2.从它的许多竞争继承来的三个主要特点: l Redis数据库完全在 ...
- Linux Mint如何添加windows分享的网络打印机?
1.安装samba sudo apt-get install samba 2.找到系统打印机选项 通过 Menu-->>控制中心-->>系统管理找到 Printers选项,双击 ...
- VS2017 community版使用码云(gitee)的一些过程,看图学习,傻瓜式教程
首先你得有一个gitee账号,VS2017IDE开发工具 第一步,打开VS2017,点击菜单栏上->工具->扩展与更新,如图 然后点击 联机 然后输入 gitee 回车搜索 一定要选择我圈 ...
- 一个简易的kmp教学并给出java实现
简单介绍一下问题 给定source字符串,找出target字符串出现的首位 例如 source 为“abddabddabc” target 为 “abddabc” 从第一位开始比较 |a b d ...
- hexo 建站参考
1. hexo 官网 2. 主题 AD:https://godbmw.com/ 前期尝试了两天都是看主题,还有编辑主题,最终选择这个主题是因为两点 主题layout是 ejs 学习node时候了解过 ...
- 借助FreeHttp任意篡改http报文 (使用·实现)
引言 FreeHttp是一个Fiddler插件借助FreeHttp您可按照您自己的设定修改请求或响应报文,这对测试及调试都非常有用 比如您发现线上页面js文件错误,直接使用规则替换新的js文件您可以在 ...
- 面试7家,收到5个offer,我的Python就业经验总结 !
*---------------------------------------人生处处有惊喜,背后却是无尽的辛酸苦辣. Python找工作并不容易,老表面试了很多企业,总结了些宝贵经验! 一周转 ...
- Net core 关于缓存的实现
在很多项目中, 需要用到缓存,借鉴网上前辈们的一些经验,自己再进行总结简化了一些, 做出如下的缓存操作,其中包含内存缓存(IMemoryCache) 和 Redis 缓存; 一.前提内容, 导入两个包 ...
- 微信内无法自动跳转外部浏览器打开H5分享链接的解决办法
很多情况下我们用微信分享转发H5链接的时候,都无法在微信内打开,即使开始能打开,过一段时间就会被拦截,拦截后再打开微信会提示 “已停止访问该网址” ,那么导致这个情况的因素有哪些呢,主要有以下四点 1 ...
- webstorm配置svn详解
1. 打开webstorm-> file -> setting -> plguins 输入svn如果没有SVNToolBox就在下面的列表中安装SVNToolBox插件即可. 2.c ...