webpack练手项目之easySlide(二):代码分割

Hello,大家好。

在上一篇 webpack练手项目之easySlide(一):初探webpack  中我们一起为大家介绍了webpack的基本用法,使用webpack对前端代码进行模块化打包。

但是乍一看webpack只是将所有资源打包到一个JS文件中而已,并没有做到真正的按需加载,这当然不是我们所想要的。

不急,今天的这一章我们就来一起继续探索webpack的另外一个功能:code split.

  1.什么是code split

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

  这里举一个实际应用场景:上次我们做的图片轮播,我们为每张图片都添加一个点击事件,点击以后我们弹出一个对话框,里面介绍一些详细内容,然后可以点击关闭按钮进行关闭。

  在这个需求中我们发现,对话框这个组件比较特殊,他是在用户点击图片以后才需要加载,如果用户不点击,那么他就没有必要加载出来了。

  OK,很好。webpack通过code split方法将页面必须加载的资源放在bundle.js中,然后对于按需加载的资源通过ajax进行异步加载。

  webpack通过 require.ensure 来判断是否对资源进行按需加载。

  下面是官网的简单用例:

1 require.ensure(["module-a", "module-b"], function(require) {
2     var a = require("module-a");
3     // ...
4 });

  

    

   2.Demo与Code

    同样的,我已经将上面所说的对话框按需加载实现,大家感兴趣的话可以前往查看:

    Demo:  http://xiaoyunchen.github.io/easySlide/

    Code:   https://github.com/xiaoyunchen/easySlide

    大家可以打开控制台网络面板,查看资源的加载情况:

    页面加载的时候只有7个请求,这其中其实并没有包含我们的对话框组件:

    

    然后大家可以点击任意一张图片,这个时候网络浏览器发送了新的网络请求,然后页面上也打开了对话框:

    

    这个2.chunk.js也就是webpack为我们打包的对话框组件,包括JS逻辑,HTML模板以及CSS样式,稍后我们将为大家作详细介绍。

    (demo上有几个menu的link,大家先不用管,那是我们下一章将要介绍的内容)

   3.组件引用与webpack打包

    接下来我们来看看代码上都发生了哪些变动。

    首先是index.html与index.css,并没有任何修改。(index.html中增加了header与footer,增加了多个图片轮播组件,为下一章做的准备。但是都与对话框组件没有任何关系)

    那来看看index.js的修改,具体的源码大家可以查看github,这里只对后面新增的代码进行分析:

 1 //添加对话框事件
 2     var pageDialog=false;
 3     $(‘.pictureShow a‘).click(function(){
 4         var _id=$(this).attr(‘dialog-for‘);
 5         require.ensure(["../module/dialog.js","../module/dialogConfig.js"], function(require) {
 6             var dialogModule=require("../module/dialog.js");
 7             var dialogConfig=require("../module/dialogConfig.js");
 8             if(!pageDialog){    //判断对话框组件是否存在,避免重复创建
 9                 pageDialog=new dialogModule();
10             }
11             pageDialog.openDialogWith(dialogConfig[_id]);
12         });
13     });

    首先我们定义了一个对象,然后为页面上所有的滑动元素增加了一个单击事件。

    第4行:获取当前事件元素的dialog-for属性,这是我们在每个滑动元素上新增的属性,用于指定其对应的对话框id

    第5行:使用了webpack的require.ensure异步加载了两个组件:dialog与dialogConfig,这两个组件分别是对话框的具体实现逻辑以及对话框内容配置信息,详细的代码我们后面再分析

    第6/7行:加载完成后得到两个组件的引用

    第8-10行:判断pageDialog是否存在,如果不存在我们通过调用dialog组件new一个实例,并将赋值给pageDialog。

    这里主要是为了避免多次点击时页面重复创建dialog Html元素,降低页面性能

    第11行:使用pageDialog实例,调用openDialogWith方法来打开对话框,同时要从dialogConfig中加载指定的对话框配置内容。

    

    是的,哪怕是在我们没有查看dialog组件具体源码的情况下,整个逻辑还是相对比较清晰的。我们不用理会dialog组件调用了什么模板,用了什么css样式,内部实现了哪些方法。

    定义组件的一大目的就是降低代码之前的耦合性,作为组件,我只管定义如何实现一个组件;作为组件调用者,我只管衣来伸手饭来张口的拿来主义,

    不管你内部是如何实现的。

  

    接下来看webpack是如果对上面的代码进行打包的:

    以下是webpack.config.js配置文件部分内容:

 1 module.exports = {
 2     entry: {
 3             index:"./src/js/page/index.js",
 4             delegate:"./src/js/page/jsEvent.js"
 5         },
 6     output: {
 7         path: path.join(__dirname,‘dist‘),
 8         publicPath: "/easySlide/dist/",
 9         filename: "[name].js",
10         chunkFilename: "[id].chunk.js"
11     },
12     module: {
13         loaders: [    //加载器
14             {test: /\.css$/, loader: "style!css" },
15             {test: /\.html$/, loader: "html" },
16             {test: /\.(png|jpg)$/, loader: ‘url-loader?limit=8192‘}
17         ]
18     }
19
20 };

    改动的地方不多,主要是以下几点:

  第10行:定义了chunk的文件名命名规则,这里除了id以外,还可以使用[hash]

  第8行:publicPath 这个配置很容易被疏忽。我们的chunk文件默认是跟bundle放在一块的,都是在dist目录下,如果不配置正确的publicPath的话,webpack请求chunk文件时将会默认请求根目录

  第15行:新增了HTML加载器,主要是给dialog组件加载模板使用的

  codeSplit作为webpack一个比较核心的功能,所以也需要额外的plugins插件配置就能支持。

  在项目根目录下运行 webpack 打包命令以后可以看到dist目录下就会新增一个 2.chunk.js文件 (2是chunk的ID值)

  值得一提的是,chunk文件完全由webpack进行管理和使用,我们无需额外的干预

  4.dialog组件的实现

    dialog的实现原理比较简单,我们定义了一个dialog容器,通过css控制其固定在整个页面之上,然后在生成一个mask阴影层。

    具体的实现css样式大家也可以前往github查看源码。

    dialog组件的实现方法也是与我们之前做的slideModule比较类似:

   

    第10-11行:加载了dialog组件的HTML模板,并将其放置在body中。嗯,之所有是要使用html模板也是为了解耦合,方便对模板和JS进行单独维护。这里webpack在打包的时候

  会自动将html模板压缩成字符串保存在chunk文件中。

    第16-44行:定义了dialog组件的几个接口方法,其中openDialogWith 就是我们之前调用的根据配置内容更新dialog DOM信息,然后将dialog展示出来。

  

    对于dialogConfig我们也简单的来看下:

    

    这里全部都是对话框的数据配置项,单独维护的好处也是解耦合,以外咱们可以将这些数据配置在数据库中,通过接同样的接口格式返回来就行了。

    其实我这里的组件定义还有一个问题:

    我们是将自定义的对象直接作为组件导出,开放给调用者使用。这在操作上其实存在一定的风险性,因为所有接口方法和属性都是开放的,那就有可能被使用者

  给篡改,影响到组件的正常使用。正确的做法是:

    在组件内部定义一个私有变量,用户存放组件所有属性与方法,然后再将接口方法(一般不建议开放属性给调用者直接修改)导出给调用者使用。

  

  

    小结:

      通过webpack的codeSplit方法我们可以对代码进行按需分割以及加载,从而到达页面性能的最优。

时间: 2024-10-14 20:59:08

webpack练手项目之easySlide(二):代码分割的相关文章

webpack练手项目:easySlide(一)

最近在学习webpack,正好拿了之前做的一个小组件,图片轮播来做了下练手,让我们一起来初步感受下webpack的神奇魅力.     webpack是一个前端的打包管理工具,大家可以前往:http://webpack.github.io/ 作详细了解.相对于之前的前端模块打包工具, 个人认为webpack至少拥有以下值得我们拿来一用的优点: js/css/img/html等等都是静态资源,都可以通过webpack进行打包处理 所有资源都可以按需加载,避免了之前的加载器把所有资源打包在一个文件,导

Python之路【第二十四篇】:Python学习路径及练手项目合集

Python学习路径及练手项目合集 Wayne Shi· 2 个月前 参照:https://zhuanlan.zhihu.com/p/23561159 更多文章欢迎关注专栏:学习编程. 本系列Python技术路径中包含入门知识.Python基础.Web框架.基础项目.网络编程.数据与计算.综合项目七个模块.路径中的教程将带你逐步深入,学会如何使用 Python 实现一个博客,桌面词典,微信机器人或网络安全软件等.完成本路径的基础及项目练习,将具备独立的Python开发能力. 完整的Python学

前端练手项目

前端学习还是很有趣的,可以较快的上手然后自己开发一些好玩的项目来练手,网上也可以一抓一大把关于前端开发的小项目,可是还是有新手在学习的时候不知道可以做什么,以及怎么做,因此,就整理了一些前端项目教程,希望可以帮助正在学习前端的小伙伴.为了方便阅读,大概把前端可以做的项目分为三类: 游戏类 实用类 好玩类 然后依次推荐一些项目教程,想要学习的小伙伴可以看看~ 游戏类 其实很多常见的小游戏都是纯前端开发出来的,比如曾经风靡的2048.别踩白块啊等等,简单有趣,对于初学者来说,这些小游戏是非常不错的练

20个Java练手项目,献给嗜学如狂的人

给大家推荐一条由浅入深的JAVA学习路径,首先完成 Java基础.JDK.JDBC.正则表达式等基础实验,然后进阶到 J2SE 和 SSH 框架学习.最后再通过有趣的练手项目进行巩固. JAVA基础 Java编程语言(新版 2. Java进阶之设计模式 3. JDK 核心 API 4. MySQL 基础课程 5. 正则表达式基础 6. JDBC 入门教程 J2SE & SSH框架 7. Java 函数式编程 8. J2SE网络通信实践 9. Struts框架教程 10. Hibernate框架教

练手项目之image caption问题记录

小白一个,刚刚费了老大的劲完成一个练手项目--image caption,虽然跑通了,但是评估结果却惨不忍睹.于是贴上大神的作品,留待日后慢慢消化.顺便记录下自己踩坑的一些问题. 先膜拜下大神的作品. 本次项目采用的模型结构如下.一路输入信息是利用VGG16提取的图像特征,另一路输入信息是利用LSTM提取的单词串特征,输出是预测的下一个单词.即模型的功能是,在给定图像特征和caption前面若干个单词的情况下,能预测出caption的下一个单词:所以循环若干次后即可得到一句完整的caption.

Python练手项目:20行爬取全王者全英雄皮肤

引言 ? ?王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了.我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成. ? ?文中源代码在文章末尾,可自行复制粘贴. 准备工作 ? ?爬取皮肤本身并不难,难点在于分析,我们首先得得到皮肤图片的url地址,话不多说,我们马上来到王者荣耀的官网: ? ?我们点击英雄资料,然后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片地址: ? ?接着,我们切换一下英雄的

推荐的阅读及练手项目

关于作者: He is an expert in numerous languages including .NET, PHP, C/C++, Java and more 推荐阅读(Software development, Desktop, Web) http://www.coderslexicon.com/recommended-reading/ 推荐练手项目: http://blog.jobbole.com/49762/, 对应的电子书名叫The Programmers Idea Book

程序员练手项目

转自:http://mp.weixin.qq.com/s?__biz=MzA4OTE4MjIwMA==&mid=2666146030&idx=1&sn=765c206ffcb28822674376985cdf9393&scene=23&srcid=0801NjfvdJozzoHkpC1BGnN4#rd 我经常看有人发帖问关于项目点子的事,也看到了很多回帖,我自己也回了一些常见的项目.不过我觉得只列出三两个是远远不够的,因此就收集并这个项目列表,大家要找简单的编程项目

70个Python练手项目

前言: 不管学习那门语言都希望能做出实际的东西来,这个实际的东西当然就是项目啦,不用多说大家都知道学编程语言一定要做项目才行. 这里整理了70个Python实战项目列表,都有完整且详细的教程,你可以从中选择自己想做的项目进行参考学习练手,你也可以从中寻找灵感去做自己的项目. 70个Python项目列表: 1.[Python 图片转字符画]2.[200行Python代码实现2048]3.[Python3 实现火车票查询工具]4.[高德API+Python解决租房问题 ]5.[Python3 色情图