首页 > 其他分享 >webpack学习笔记之代码分割和按需加载的实例详解

webpack学习笔记之代码分割和按需加载的实例详解

时间:2022-12-13 00:44:13浏览次数:52  
标签:function require list js webpack 详解 ensure var 加载

主要介绍了webpack学习笔记之代码分割和按需加载的实例详解,具有一定的参考价值,有兴趣的可以了解一下

为什么需要代码分割和按需加载

代码分割就是我们根据实际业务需求将代码进行分割,然后在合适的时候在将其加载进入文档中。

举个简单的例子:
  1. 一个HTML中存在一个按钮
  2. 点击按钮出现一个包着图片的div
  3. 点击关闭按钮图片消失
Demo目录:

image

一.当未点击按钮时浏览器只加载了对入口文件打包后的js

image

二.点击按钮会对组件进行异步加载

image

这个clichunk就是我们打包好的click组件,包括相应的JS逻辑htmlcss

例子源码记录

  1. 编辑入口文件
点击查看代码
window.onload=function(){
     var _cs=require('./index.css');
     var $=require('jquery');
 
     $('#_click').on('click',function(){
       require.ensure([],function(require){
         var _click=require('./_clickWindow.js');
         if(!_clickEvent){
           console.log(_click);
           var _clickEvent=_click._clicks;
         }
         new _clickEvent();
       },'cli')
     });
};

webpack将一切视为模块,CSSjshtmlJSX等等。
var _cs=require('./index.css');
引入对应的css模块。这就需要我们安装css-loderstyle-loader
npm install css-loader style-loader --dev -dev
–save -dev的目的是为了在package.json文件的devDependencies写入依赖项。

点击按钮时,加载定义好的组件,当加载完成后执行组件里的方法。

首先要学习require.ensure方法:
commonjs中有一个Modules/Async/A规范,里面定义了require.ensure语法。webpack实现了它,作用是可以在打包的时候进行代码分片,并异步加载分片后的代码。

用法如下:
点击查看代码
require.ensure([], function(require){
  var list = require('./list');
  list.show();
});
中括号内写入依赖项

此时list.js会被打包成一个单独的chunk文件,大概长这样:1.fb874860b35831bc96a8.js

可读性比较差,此时就需要加入第三个参数

点击查看代码
require.ensure([], function(require){
  var list = require('./list');
  list.show();
}, 'list');

此时打包后的js文件名为:list.fb874860b35831bc96a8.js
也可以传入像question/list这样带层级的名字,这样webpack会按照层级给你创建文件夹。

点击查看代码
require.ensure([], function(require){
  var list = require('./list');
  list.show();
  var edit = require('./edit');
  edit.display();
}, 'list_and_edit');

同时引入两个文件,webpack会将这两个文件和写入的依赖项打包在一起,如果你不希望打包在一起,只能写两require.ensure分别引用这两个文件。

点击查看代码
require.ensure([‘./a.js'], function(require){
  var list = require('./list');
  list.show();
});
 
require.ensure([‘./a.js'], function(require){
  var b = require('./b');
  b.show();
});

如果listb同时以来a.js那么在打包时a.js会被重复打包两次,如果想解决这样的问题,那么

点击查看代码
require.ensure([‘./a.js'], function(require){
  var list = require('./list');
  list.show();
},'list-b');
 
require.ensure([‘./a.js'], function(require){
  var b = require('./b');
  b.show();
},'list-b');

此时这三个文件就会被打包在一起。

  1. 组件js
点击查看代码
(function(){
  var _html=require('./_clickHtml.html');
  var $=require('jquery');
 
  function ClickWindow(){
   this.div=$('body').append(_html);
   $('#_tip').append('<img src="./timg.jpg">');
   this.init();
  }
  ClickWindow.prototype.init=function(){
   $('#_tip').append('<button>关闭</button>')
     .on('click',function(){
       $('img').animate({'width':0},300);
     });
  };
 
  module.exports._clicks=ClickWindow;
})();

引入写好的html同上需要下载html-loader

  1. 配置文件
点击查看代码
var path=require('path');
module.exports={
 entry:__dirname+'/index.js',
 output:{
   path: __dirname,
   filename:'[name]bundle.js',
   chunkFilename:'[name]chunk.js'
 },
  module: {
      loaders: [  //加载器
       {test: /\.css$/, loader: "style!css" },
       {test: /\.html$/, loader: "html" },
       {test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192'}
      ]
  }
};

filename:'[name]bundle.js',

[name]指向入口文件的name

chunkFilename:'[name]chunk.js'

[name]指向require.ensure定义的第三个参数

标签:function,require,list,js,webpack,详解,ensure,var,加载
From: https://www.cnblogs.com/as3Gui/p/16977544.html

相关文章

  • webpack学习笔记之优化缓存、合并、懒加载
    除了的webpack基本配置,还可以进一步添加配置,优化合并文件,加快编译速度。下面是生产环境配置文件webpack.production.js,与wenbpack.config.js相比其不需要一些dev-tools,dev......
  • 优化网页的加载速度
    引言不是所有人都能够使用高速Internet连接。即使每个人都能够使用高速网络,也会因为各种各样的原因使您的Web应用程序看起来运行缓慢。在这个宽带速度不断提高的时代,您......
  • django-路由层详解
    django-路由层详解可视化界面之数据增删改查针对数据对象主键字段的获取可以使用更加方便的obj.pk获取在模型类中定义双下str方法可以在数据对象被执行打印操作的时候......
  • GLES3.0中文API-glGetActiveUniform详解
    前言     glGetActiveUniform()函数看了官方的解释,也看了别人的一些帖子,但是基本上都没有实际的代码,没有实操总觉得隔了一层,雾里看花理解不了。下面亲自写段代码验......
  • RFO SIG:openEuler AWS AMI 制作详解
    作者简介王瀚兴,SUSE软件工程师,主要负责Rancher产品线相关的研发工作。欧拉开源社区的RFOSIG正在努力将openEuler与Rancher整合,以推动社区的云原生版图发展。而op......
  • C语言操作符详解
    操作符分类:算术操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符逗号表达式下标引用,函数调用和结构成员算术操作符(+-*/%)1.除了%操作符......
  • 《Java并发编程详解》读书笔记
    嗯,书是假期开始看的感觉,虽然部分知识以前学过,但是在学一次巩固一下。嗯,加油生活。摘一句子,^_^有一天,突然发现自己没有热爱的东西了。就这样进入浪费时间的年代。秋天一到,候......
  • JS逆向之浏览器补环境详解
    JS逆向之浏览器补环境详解“补浏览器环境”是JS逆向者升职加薪的必备技能,也是工作中不可避免的操作。为了让大家彻底搞懂“补浏览器环境”的缘由及原理,本文将从以下四个......
  • Eclipse安装和配置环境教程(图文详解)
    前言在上一篇文章中,壹哥给大家介绍了Notepad++这个更高级点的记事本,它进行Java开发相比windows自带的记事本要更方便一些。但是即便如此,用这种记事本进行Java开发效率依然......
  • [转]MySQL 中 Blob 和 Text 数据类型详解
    原文地址:https://mp.weixin.qq.com/s/SjaCSkcjT0rcO1n41RuEcA前言:前面文章我们介绍过一些常用数据类型的用法,比如int、char、varchar等。一直没详细介绍过blob及te......