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


Posted in Javascript onJuly 20, 2017

本文介绍了webpack学习笔记之代码分割和按需加载的实例详解,分享给大家,也给自己留个笔记

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

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

举个简单的例子:

1.一个HTML中存在一个按钮

2.点击按钮出现一个包着图片的div

3.点击关闭按钮图片消失

Demo目录:

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

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

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

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

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

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

例子源码记录

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将一切视为模块,CSS,js,html,JSX等等。

var _cs=require('./index.css');

引入对应的css模块。这就需要我们安装css-loder和style-loader。

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

?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();
});

如果list和b同时以来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');

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

2.组件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

3.配置文件

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定义的第三个参数

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

Javascript 相关文章推荐
JS 参数传递的实际应用代码分析
Sep 13 Javascript
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
Feb 24 Javascript
如何获取select下拉框的值(option没有及有value属性)
Nov 08 Javascript
8个实用的jQuery技巧
Mar 04 Javascript
JavaScript中指定函数名称的相关方法
Jun 04 Javascript
一种基于浏览器的自动小票机打印实现方案(js版)
Jul 26 Javascript
Vue.js 中的 $watch使用方法
May 25 Javascript
JS实现的简单标签点击切换功能示例
Sep 21 Javascript
在NPM发布自己造的轮子的方法步骤
Mar 09 Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
Mar 22 Javascript
微信小程序云开发详细教程
May 16 Javascript
原生js实现下拉框选择组件
Jan 20 Javascript
node+vue实现用户注册和头像上传的实例代码
Jul 20 #Javascript
深入探究AngularJs之$scope对象(作用域)
Jul 20 #Javascript
通过命令行创建vue项目的方法
Jul 20 #Javascript
基于BootStrap实现简洁注册界面
Jul 20 #Javascript
AngularJS实现的JSONP跨域访问数据传输功能详解
Jul 20 #Javascript
深入探究node之Transform
Jul 20 #Javascript
微信小程序“摇一摇”的实例代码
Jul 20 #Javascript
You might like
收音机发烧友应当熟知的100条知识
2021/03/02 无线电
php 缓存函数代码
2008/08/27 PHP
PHP extract 将数组拆分成多个变量的函数
2010/06/30 PHP
用PHP的超级变量$_GET获取HTML表单(Form) 数据
2011/05/07 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
DEFER怎么用?
2006/07/01 Javascript
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
Js四则运算函数代码
2012/07/21 Javascript
jquery在IE、FF浏览器的差别详细探讨
2013/04/28 Javascript
JavaScript实现Java中StringBuffer的方法
2015/02/09 Javascript
使用jQuery实现WordPress中的Ctrl+Enter和@评论回复
2016/05/21 Javascript
javascript时间差插件分享
2016/07/18 Javascript
在js中做数字字符串补0(js补零)
2017/03/25 Javascript
react-native fetch的具体使用方法
2017/11/01 Javascript
快速了解vue-cli 3.0 新特性
2018/02/28 Javascript
对Angular中单向数据流的深入理解
2018/03/31 Javascript
详解Vue依赖收集引发的问题
2019/04/22 Javascript
解决nuxt 自定义全局方法,全局属性,全局变量的问题
2020/11/05 Javascript
Vue页面渲染中key的应用实例教程
2021/01/12 Vue.js
js面向对象封装级联下拉菜单列表的实现步骤
2021/02/08 Javascript
[01:43]倾听DOTA2英雄之声 魅惑魔女国服配音鉴赏
2013/06/06 DOTA
[13:55]Newbee vs Team Spirit
2018/06/07 DOTA
用Python实现命令行闹钟脚本实例
2016/09/05 Python
Python设计模式之迭代器模式原理与用法实例分析
2019/01/10 Python
python3正则模块re的使用方法详解
2020/02/11 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
2020/06/02 Python
Django mysqlclient安装和使用详解
2020/09/17 Python
家用个人磨皮机:Trophy Skin
2017/03/30 全球购物
Linux文件系统类型
2012/02/15 面试题
银行工作检查书范文
2014/01/31 职场文书
护士长竞聘演讲稿
2014/04/30 职场文书
企业党建工作汇报材料
2014/08/19 职场文书
店铺转让协议书
2014/12/02 职场文书
幼儿园学前班幼儿评语
2014/12/29 职场文书
2015大学生入党个人自传
2015/06/26 职场文书