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 相关文章推荐
JSQL  一个 web DB 的封装
May 05 Javascript
jQuery timers计时器简单应用说明
Oct 28 Javascript
用显卡加速,轻松把笔记本打造成取暖器的办法!
Apr 17 Javascript
jquery实现简单易懂的图片展示小例子
Nov 21 Javascript
JavaScript判断一个字符串是否包含指定子字符串的方法
Mar 18 Javascript
原生JavaScript实现瀑布流布局
Jun 28 Javascript
基于Vue.js的表格分页组件
May 22 Javascript
Google 地图叠加层实例讲解
Aug 06 Javascript
微信小程序wx.uploadfile 本地文件转base64的实现代码
Jun 28 Javascript
微信小程序画布圆形进度条显示效果
Nov 17 Javascript
详解JSON和JSONP劫持以及解决方法
Mar 08 Javascript
微信小程序 云开发模糊查询实现解析
Sep 02 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
织梦模板标记简介
2007/03/11 PHP
php错误级别的设置方法
2013/06/17 PHP
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
2013/06/18 PHP
有关于JS构造函数的重载和工厂方法
2013/04/07 Javascript
JS实现一个列表中包含上移下移删除等功能
2014/09/24 Javascript
前端必备神器 Snap.svg 弹动效果
2014/11/10 Javascript
深入分析js的冒泡事件
2014/12/05 Javascript
HTML5实现留言和回复页面样式
2015/07/22 Javascript
jquery实现很酷的网页顶部图标下拉菜单效果
2015/08/22 Javascript
纯javascript实现自动发送邮件
2015/10/21 Javascript
Javascript中arguments对象的详解与使用方法
2016/10/04 Javascript
vue实践---vue不依赖外部资源实现简单多语操作
2020/09/21 Javascript
js实现石头剪刀布游戏
2020/10/11 Javascript
python人人网登录应用实例
2014/09/26 Python
python中类变量与成员变量的使用注意点总结
2017/04/29 Python
python爬虫_自动获取seebug的poc实例
2017/08/05 Python
python+matplotlib绘制3D条形图实例代码
2018/01/17 Python
Python爬虫实例扒取2345天气预报
2018/03/04 Python
python模糊图片过滤的方法
2018/12/14 Python
python重试装饰器的简单实现方法
2019/01/31 Python
python matplotlib拟合直线的实现
2019/11/19 Python
使用python检查yaml配置文件是否符合要求
2020/04/09 Python
django 模版关闭转义方式
2020/05/14 Python
为什么说python更适合树莓派编程
2020/07/20 Python
Python sqlalchemy时间戳及密码管理实现代码详解
2020/08/01 Python
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
医院后勤自我鉴定
2013/10/13 职场文书
《草原的早晨》教学反思
2014/04/08 职场文书
上课说话检讨书
2015/01/27 职场文书
个人自荐书怎么写
2015/03/26 职场文书
行政司机岗位职责
2015/04/10 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书
《自己去吧》教学反思
2016/02/16 职场文书
Go 语言结构实例分析
2021/07/04 Golang
Python使用OpenCV实现虚拟缩放效果
2022/02/28 Python