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 相关文章推荐
javascript 获取select下拉列表值的代码
Sep 07 Javascript
js 中的switch表达式使用示例
Jun 03 Javascript
超简单JS二级、多级联动的简单实例
Feb 18 Javascript
JavaScript的作用域和块级作用域概念理解
Sep 21 Javascript
提交按钮的name='submit'引起的js失效问题及原因
Feb 25 Javascript
浅谈JavaScript数据类型及转换
Feb 28 Javascript
JS模拟简易滚动条效果代码(附demo源码)
Apr 05 Javascript
JavaScript瀑布流布局实现代码
May 06 Javascript
Vue组件化通讯的实例代码
Jun 23 Javascript
antd组件Upload实现自己上传的实现示例
Dec 18 Javascript
vue使用Font Awesome的方法步骤
Feb 26 Javascript
ant design vue导航菜单与路由配置操作
Oct 28 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
基于empty函数的输出详解
2013/06/17 PHP
教你如何在CI框架中使用 .htaccess 隐藏url中index.php
2014/06/09 PHP
PHP判断一个字符串是否是回文字符串的方法
2015/03/23 PHP
php函数连续调用实例分析
2015/07/30 PHP
PHP获取网站中各文章的第一张图片的代码示例
2016/05/20 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
2017/08/18 PHP
Laravel 类和接口注入相关的代码
2019/10/15 PHP
PHP二维数组分页2种实现方法解析
2020/07/09 PHP
基于jquery实现的仿优酷图片轮播特效代码
2016/01/13 Javascript
Bootstrap布局组件教程之Bootstrap下拉菜单
2016/06/12 Javascript
EasyUI中在表单提交之前进行验证
2016/07/19 Javascript
JavaScript实现网页头部进度条刷新
2017/04/16 Javascript
php register_shutdown_function函数详解
2017/07/23 Javascript
Vue框架之goods组件开发详解
2018/01/25 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
2018/03/25 jQuery
微信小程序实现的点击按钮 弹出底部上拉菜单功能示例
2018/12/20 Javascript
Vue学习之组件用法实例详解
2020/01/06 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
2020/06/02 Javascript
python通过yield实现数组全排列的方法
2015/03/18 Python
基于python内置函数与匿名函数详解
2018/01/09 Python
详解Python之unittest单元测试代码
2018/01/24 Python
Python文本统计功能之西游记用字统计操作示例
2018/05/07 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
Django框架首页和登录页分离操作示例
2019/05/28 Python
python入门之井字棋小游戏
2020/03/05 Python
Python控制鼠标键盘代码实例
2020/12/08 Python
详解CSS3的图层阴影和文字阴影效果使用
2016/06/09 HTML / CSS
利用Storage Event实现页面间通信的示例代码
2018/07/26 HTML / CSS
定制iPhone和Macbook保护壳:Slick Case
2018/11/21 全球购物
Ray-Ban雷朋奥地利官网:全球领先的太阳眼镜品牌
2020/10/12 全球购物
车间安全生产标语
2014/06/06 职场文书
格列佛游记读书笔记
2015/06/30 职场文书
感恩父母主题班会
2015/08/12 职场文书
简述python四种分词工具,盘点哪个更好用?
2021/04/13 Python
详解Java分布式事务的 6 种解决方案
2021/06/26 Java/Android