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 兼容鼠标滚轮事件
Apr 07 Javascript
Javascript学习笔记4 Eval函数
Jan 11 Javascript
一个基于jquery的文本框记数器
Sep 19 Javascript
window.location.href IE下跳转失效的解决方法
Mar 27 Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
Feb 02 Javascript
JavaScript实现同一页面内两个表单互相传值的方法
Aug 12 Javascript
使用vue.js写一个tab选项卡效果
Mar 25 Javascript
详解vue-router 命名路由和命名视图
Jun 01 Javascript
windows实现npm和cnpm安装步骤
Oct 24 Javascript
浅谈JavaScript中this的指向更改
Jul 28 Javascript
如何检测JavaScript中的死循环示例详解
Aug 30 Javascript
mustache.js实现首页元件动态渲染的示例代码
Dec 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
php5数字型字符串加解密代码
2008/04/24 PHP
php gzip压缩输出的实现方法
2013/04/27 PHP
smarty简单分页的实现方法
2014/10/27 PHP
javascript prototype 原型链
2009/03/12 Javascript
JavaScript Event学习第十章 一些可替换的事件对
2010/02/10 Javascript
js导出txt示例代码
2014/01/14 Javascript
使用focus方法让光标默认停留在INPUT框
2014/07/29 Javascript
Jquery中find与each方法用法实例
2015/02/04 Javascript
JS简单实现String转Date的方法
2016/03/02 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
2016/04/29 Javascript
BootStrapTable服务器分页实例解析
2016/12/20 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
2016/12/27 Javascript
详解Vue监听数据变化原理
2017/03/08 Javascript
Iscrool下拉刷新功能实现方法(推荐)
2017/06/26 Javascript
JS设计模式之数据访问对象模式的实例讲解
2017/09/30 Javascript
浅谈mint-ui loadmore组件注意的问题
2017/11/08 Javascript
js中document.write和document.writeln的区别
2018/03/11 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
vue 实现移动端键盘搜索事件监听
2019/11/06 Javascript
webpack常用构建优化策略小结
2019/11/21 Javascript
Javascript实现html转pdf高清版(提高分辨率)
2020/02/19 Javascript
详解js中的几种常用设计模式
2020/07/16 Javascript
跟老齐学Python之总结参数的传递
2014/10/10 Python
python清理子进程机制剖析
2017/11/23 Python
如何优雅地处理Django中的favicon.ico图标详解
2018/07/05 Python
python gdal安装与简单使用
2019/08/01 Python
python Event事件、进程池与线程池、协程解析
2019/10/25 Python
python实现拼图小游戏
2020/02/22 Python
PyQt5+python3+pycharm开发环境配置教程
2020/03/24 Python
详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强
2020/11/17 Python
一张图片能隐含千言万语之隐藏你的程序代码
2012/12/13 HTML / CSS
微信小程序canvas实现水平、垂直居中效果
2020/02/05 HTML / CSS
酒店总经理岗位职责
2014/03/17 职场文书
2014年涉外离婚协议书范本
2014/11/20 职场文书
Python 中的Sympy详细使用
2021/08/07 Python
python通过新建环境安装tfx的问题
2022/05/20 Python