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 相关文章推荐
学习YUI.Ext 第三天
Mar 10 Javascript
javascript 避免闭包引发的问题
Mar 17 Javascript
jQuery EasyUI datagrid实现本地分页的方法
Feb 13 Javascript
JQ技术实现注册页面带有校验密码强度
Jul 27 Javascript
javascript实现多栏闭合展开式广告位菜单效果实例
Aug 05 Javascript
KnockoutJS 3.X API 第四章之数据控制流foreach绑定
Oct 10 Javascript
js 模仿锚点定位的实现方法
Nov 19 Javascript
js实现倒计时效果(小于10补零)
Mar 08 Javascript
JS实现的3des+base64加密解密算法完整示例
May 18 Javascript
微信小程序的线程架构【推荐】
May 14 Javascript
微信小程序实现上传图片裁剪图片过程解析
Aug 22 Javascript
详解如何在Javascript和Sass之间共享变量
Nov 13 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
php 设计模式之 单例模式
2008/12/19 PHP
php stream_get_meta_data返回值
2013/09/29 PHP
thinkPHP5框架中widget的功能与用法详解
2018/06/11 PHP
在IE中调用javascript打开Excel的代码(downmoon原作)
2007/04/02 Javascript
最佳JS代码编写的14条技巧
2011/01/09 Javascript
JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)
2012/02/27 Javascript
js判断iframe内的网页是否滚动到底部触发事件
2014/03/18 Javascript
jQuery复制节点用法示例(clone方法)
2016/09/08 Javascript
jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法)
2016/09/08 Javascript
vue.js 上传图片实例代码
2017/06/22 Javascript
详解VueJs中的V-bind指令
2018/05/03 Javascript
详解Vue CLI3 多页应用实践和源码设计
2018/08/30 Javascript
小程序Scroll-view上拉滚动刷新数据
2020/06/21 Javascript
Vue.js中使用Vuex实现组件数据共享案例
2020/07/31 Javascript
前端开发基础javaScript的六大作用
2020/08/06 Javascript
微信小程序轮播图swiper代码详解
2020/12/01 Javascript
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
2014/06/09 Python
python的类方法和静态方法
2014/12/13 Python
python常用知识梳理(必看篇)
2017/03/23 Python
python实现自动登录
2018/09/17 Python
Python实现程序判断季节的代码示例
2019/01/28 Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
2019/08/01 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
2020/03/24 Python
Pytorch通过保存为ONNX模型转TensorRT5的实现
2020/05/25 Python
惊艳的手工时装首饰:Migonne Gavigan
2018/02/23 全球购物
英国哈罗德园艺:Harrod Horticultural
2020/03/31 全球购物
ORACLE十问
2015/04/20 面试题
个人自我鉴定
2013/11/07 职场文书
表决心的诗句大全
2014/03/11 职场文书
幼儿园秋游感想
2014/03/12 职场文书
艺人经纪人岗位职责
2014/04/15 职场文书
电台编导求职信
2014/05/06 职场文书
2014年服务行业工作总结
2014/11/18 职场文书
二婚主持词
2015/06/30 职场文书
Python实现PIL图像处理库绘制国际象棋棋盘
2021/07/16 Python
浅谈Redis的事件驱动模型
2022/05/30 Redis