模块化的JavaScript开发的优势在哪里

如今模块化的 JavaScript 的开发越来越火热,无论是模块加载器还是优秀的 JavaScript 模块,都是层出不穷。既然这么火,肯定是有存在的理由,肯定是解决了某些实际问题。很多没接触过模块化 JavaScript 开发者不禁要问,我真的需要模块化吗,模块化相比于传统的模式有什么优势?

JavaScript 本身是没有模块化支持的,很多语言多有,就连 CSS 都有这样的加载方式。

虽然因为性能问题不推荐 CSS 这样来进行加载,但这是一种模块化的思想,这种思想对于 JavaScript 来说很有用。幸好 JavaScript 是一门灵活的语言,可以通过下面这段代码来进行动态加载 JavaScript 文件。

传统的加载方式必须在页面中放置一个 script 标签来进行加载。

<script type="text/javascript" src="http://example.com/test.js"></script>

更好的分离

那如果要加载多个就得放置多个 script 标签,如果是加载模块的话,拿 easy.js 来说,页面中始终只要引用 easy.js 即可,这样对于 HTML 和 JavaScript 分离很有好处,在某些场景下这个分离度很重要。

就拿我司的情况来说吧。后端的 view 层并不是由我们前端来开发的,项目上线的时候,前端只能更新 CSS 和 JS 文件,HTML 文件动不了。如果前端要在该页面新增一个 JavaScript 文件的引用是很麻烦的,因为后端程序的更新都要严格按照流程来并有固定的更新时间,如果是用模块加载的方式不用再理会后端的更新。当然,你也许会说,如果原页面中已经有 JavaScript 文件,我直接在原文件中加代码不就行了,那么接下来说说直接在原文件中新增代码会碰到什么样的问题。

更好的代码组织方式

如果单个文件越来越大,维护起来出问题的几率也会越来越大,一个人开发还好,如果是多人开发,不同的代码风格,超多的业务逻辑混杂在一起,不要说维护了,光想想都蛋痛。模块式的开发,一个文件就是一个模块,控制了文件的粒度,每个模块可以专注于一个功能。正所谓一个萝卜一个坑,多人开发时,各自管好自己坑里的萝卜就行了,这也正是 OOP 的思想。

按需加载

还是围绕单个文件来说事,当文件大到一定的程度,性能问题也随之而来了。合并文件是能减少请求,这是会带来性能的提升,但是当文件大到一定的体积时,此时的下载时间可能并不会比多个小文件的下载时间更短。此时就需要权衡请求数和文件体积的关系了。

单文件还有一个问题,那就是缓存是否能充分的利用好。如果一个大体积的文件内包含了超多的业务逻辑和复杂的功能,而这个文件同时又被很多页面引用到。比如在某页面,实际只用到了该文件一个很少的功能,那么其他的代码对于该页面来说就是多余的,浪费了加载流量。你或许会说,这个文件虽然大,但是它第一次加载的时候就被缓存过了,尽管在某页面只用到了极少部分的功能,但只要缓存过,加载还是挺快的。是的,如果情况有这么理想肯定是好事。但是,往往理想和现实都会有差距,如果产品的迭代更新太快,业务需求一天一个样,那么该文件就会三天两头的更新,更新可能是一个很小的功能,但是这样的更新对于刷新缓存的代价可是很大的。如果确实有这种情况,就说明这种设计确实是有问题。如果能合理的对文件进行模块化的管理,那么可以尽量减少不必要的加载,尽量减少刷新大文件的缓存带来的损失,这也需要权衡好,比如将很少更新的合并成一个文件,常更新的独立成模块。

避免命名冲突

JavaScript 本身是没有命名空间的,为了避免命名冲突,经常会使用对象和闭包的办法来避免。用对象仅仅是降低了冲突的概率而已,拿经常使用 jQuery 的开发来说,无论是往 $ 上扩展还是在 $.fn 上扩展,人多了难免会起冲突。或者用自定义的对象,搞个好几层,不光是写起来难记,这样的调用也会在性能上打折扣的。模块化就很好的解决了这个问题,在该模块内的任何形式的命名都不会再和其他模块有冲突,你想起啥名都行了。当然,你硬要在模块内部给 window 上挂一堆东西,我也没办法。

既然每个模块都是封闭式的,那么模块之间如何通信呢?接口的设计那是必须的。很简单,对于像 seajs 这种 CMD 规范的,需要使用自定义的关键字来向外部暴露一个接口。

define(function( require, exports ){
    var hello = ‘hello world‘;

    // 向外部暴露该模块的接口

    exports.hello = hello;

});

easy.js 遵循 AMD 规范,暴露接口更简单,直接用 return 关键词即可。

define( ‘hello‘, function(){
    var hello = ‘hello world‘;
    // 向外部暴露该模块的接口
    return hello;
});

更好的依赖处理

传统的开发模式,如果 B 文件要依赖 A 文件,那么必须在 B 文件前面用 script 的形式先加载好 A 文件。如果有一天,B 文件不再需要依赖 A 文件,或者要增加依赖文件 C,那么又回到了我说的第一个问题上。如果这个 B 文件被 N 个页面在调用,而且页面还跨业务站点,那改起来简直就是噩梦啊。如果是用模块化,只需要在模块内部声明好依赖就行了,增加删除都直接修改模块即可。调用的时候也不用管该模块依赖了哪些其他模块,放心的用就是了。

好了,讲了这么多,如果你还是觉得无动于衷,要么是你接触到的项目较小,还没复杂到这个程度,要么就是我的表达能力有问题。如果你觉得还有什么需要补充的,欢迎在下面留言。

原载于:雨夜带刀‘s Blog
本文链接:http://stylechen.com/modular-javascript.html
如需转载请以链接形式注明原载或原文地址。

时间: 2024-10-29 19:11:44

模块化的JavaScript开发的优势在哪里的相关文章

使用SeaJS实现模块化JavaScript开发

前言 SeaJS是一个遵循CommonJS规范的JavaScript模块加载框架,可以实现JavaScript的模块化开发及加载机制.与jQuery等JavaScript框架不同,SeaJS不会扩展封装语言特性,而只是实现JavaScript的模块化及按模块加载.SeaJS的主要目的是令JavaScript开发模块化并可以轻松愉悦进行加载,将前端工程师从繁重的JavaScript文件及对象依赖处理中解放出来,可以专注于代码本身的逻辑.SeaJS可以与jQuery这类框架完美集成.使用SeaJS可

为什么原生 JavaScript 开发越来越多受欢迎?是否应该跟风用原生JavaScript代替 jQuery等库?

本文标签:  jQuery的作用 原生JavaScript优势 jQuery官网 jQuery处理DOM和跨浏览器 JavaScript新特性 互联网杂谈 随着 JavaScript 本身的完善,越来越多的人开始喜欢使用原生 JavaScript 开发代替各种库,其中不少人发出了用原生 JavaScript 代替 jQuery 的声音.这并不是什么坏事,但也不见得就是好事.如果你真的想把 jQuery从前端依赖库中移除掉,我建议你慎重考虑. 首先 jQuery 是一个第三方库.库存在的价值之一在

浅谈模块化的JavaScript

模块化JavaScript之风早已席卷而来, CommonJS . AMD . NodeJS .RequireJS . SeaJS . curljs  等模块化的JavaScript概念及库扑面而来,不得不承认,对于前端JavaScript代码的组织编写是一次伟大的变革.本文主要参考snandy 的有关 modular js 系列文章,对SeaJS和RequireJS做一个系统的深入分析及对比. 一.我们为什么要用模块化的JavaScript 相信大家也都经历了“过程式的JavaScript”.

4: 模块化应用程序开发(纯汉语版)

模块化应用程序是指由松耦合的功能单元(模块)集成在一起的大型应用.一个客户端模块封装了程序的一部分功能和相关问题.模块可以使一些相关组件的集合,例如程序功能,包括界面和业务逻辑,或是程序基础架构,例如日志或是授权用户等程序级别的服务.模块之间互相独立又可以松耦合通信.使用模块化应用程序设计是开发测试,部署和维护你的应用程序更加简单. 举个例子,一个私人银行程序.用户可以访问多种功能,例如转账,支付账单,并更新个人信息.然而,场景背后,每个功能都封装到一个单独的模块.这些模块互相交换,或是和后台系

用JavaScript开发的桌面应用

electron是用JavaScript开发桌面应用的平台之一 http://electron.atom.io/apps/ 基于electron的著名项目有 https://github.com/Microsoft/vscode/ https://github.com/atom/atom 而且,它们是开源的! 基于electron的项目的优势: 跨平台 网页的开发模式

Prism4 文档翻译系列---第4章 模块化应用程序开发

模块化应用程序是指将一个应用程序拆分成一系列的可以组合的功能单元.一个客户端模块封装了应用程序的一部分,并且通常是一系列相关的关注点.它可以包含一个相关的组件的集合,就像用户界面,应用程序功能,和一些业务逻辑,以及一些应用程序基础模块,比如应用程序级的日至服务或者用户认证.模块之间是相互独立的但是可以通过松耦合的手段进行通信.模块化的应用程序是的开发.测试.部署和扩展变得更新容易. 例如,一个个人银行应用程序,用户可以使用各种各样的功能,比如账户间汇款,支付,从个人的界面中更新个人信息等.然而,

拥抱模块化的JavaScript

我们再一次被计算机的名词,概念笼罩.backbone.emberjs.spinejs.batmanjs 等MVC框架侵袭而来.CommonJS.AMD.NodeJS.RequireJS.SeaJS.curljs等模块化的JavaScript扑面而来.模块化JavaScript的概念尤为强烈,似乎有赶超07年Ajax风潮之趋势.一.写函数(过程式) 2005年以前,JavaScript没人重视,只作为表单验证等少量应用.那时一个网页上写不了几行JS代码,1000行算很复杂了.这时组织代码的方式是过

JavaScript 开发人员需要知道的简写技巧

本文来源于多年的 JavaScript 编码技术经验,适合所有正在使用 JavaScript 编程的开发人员阅读. 本文的目的在于帮助大家更加熟练的运用 JavaScript 语言来进行开发工作. 文章将分成初级篇和高级篇两部分,分别进行介绍. 初级篇 1.三目运算符 下面是一个很好的例子,将一个完整的 if 语句,简写为一行代码. const x = 20; let answer; if (x > 10) { answer = 'greater than 10'; } else { answe

Windows Store App JavaScript 开发:简单对象绑定

简单对象绑定是一种基本的绑定类型,可以实现将一个对象中的数据绑定到HTML元素的属性.下面通过一个示例来演示如何使用HTML5和JavaScript开发一个实现简单对象绑定的Windows应用商店应用程序.在这个应用程序中将一个img控件与一个包含图片路径信息的对象相绑定,实现在img控件中显示图片. 在Visual Studio 2012中新建一个JavaScript的Windows应用商店的空白应用程序项目,将其命名为SimpleObjectBinding.接着添加项目中用到的图片文件,在项