了解Javascript的模块化开发

 这篇文章主要介绍了了解Javascript的模块化开发,本文讲解了为什么需要模块化开发,模块化开发的形成原因等内容,需要的朋友可以参考下

 
 

小A是某个创业团队的前端工程师,负责编写项目的Javascript程序。

全局变量冲突

根据自己的经验,小A先把一些常用的功能抽出来,写成函数放到一个公用文件base.js中:

代码如下:

var _ = {
$: function(id) { return document.getElementById(id); },
getCookie: function(key) { ... },
setCookie: function(key, value) { ... }
};

小A把这些函数都放在_对象内,以防过多的全局变量造成冲突。他告诉团队的其他成员,如果谁想使用这些函数,只要引入base.js就可以了。

 

小C是小A的同事,他向小A反映:自己的页面引入了一个叫做underscore.js的类库,而且,这个类库也会占用_这个全局变量,这样一来就会跟base.js中的_冲突了。小A心想,underscore.js是第三方类库,估计不好改,但是base.js已经在很多页面铺开,不可能改。最后小A只好无奈地把underscore.js占用的全局变量改了。

此时,小A发现,把函数都放在一个名字空间内,可以减少全局变量冲突的概率,却没有解决全局变量冲突这个问题。

依赖

随着业务的发展,小A又编写了一系列的函数库和UI组件,比方说标签切换组件tabs.js,此组件需调用base.js以及util.js中的函数。

有一天,新同事小D跟小A反映,自己已经在页面中引用了tabs.js,功能却不正常。小A一看就发现问题了,原来小D不知道tabs.js依赖于base.js以及util.js,他并没有添加这两个文件的引用。于是,他马上进行修改:

代码如下:

<script src="tabs.js"></script>
<script src="base.js"></script>
<script src="util.js"></script>

然而,功能还是不正常,此时小A教训小D说:“都说是依赖,那被依赖方肯定要放在依赖方之前啊”。原来小D把base.js和util.js放到tabs.js之后了。

 

小A心想,他是作者,自然知道组件的依赖情况,但是别人就难说了,特别是新人。

过了一段时间,小A给标签切换组件增加了功能,为了实现这个功能,tabs.js还需要调用ui.js中的函数。这时,小A发现了一个严重的问题,他需要在所有调用了tabs.js的页面上增加ui.js的引用!!!

又过了一段时间,小A优化了tabs.js,这个组件已经不再依赖于util.js,所以他在所有用到tabs.js的页面中移除了util.js的引用,以提高性能。他这一修改,出大事了,测试组MM告诉他,有些页面不正常了。小A一看,恍然大悟,原来某些页面的其他功能用到了util.js中的函数,他把这个文件的引用去掉导致出错了。为了保证功能正常,他又把代码恢复了。

小A又想,有没有办法在修改依赖的同时不用逐一修改页面,也不影响其他功能呢?

模块化

小A逛互联网的时候,无意中发现了一种新奇的模块化编码方式,可以把它之前遇到的问题全部解决。

在模块化编程方式下,每个文件都是一个模块。每个模块都由一个名为define的函数创建。例如,把base.js改造成一个模块后,代码会变成这样:

代码如下:

define(function(require, exports, module) {
exports.$ = function(id) { return document.getElementById(id); };
exports.getCookie = function(key) { ... };
exports.setCookie = function(key, value) { ... };
});

base.js向外提供的接口都被添加到exports这个对象。而exports是一个局部变量,整个模块的代码都没有占用半个全局变量。

 

那如何调用某个模块提供的接口呢?以tabs.js为例,它要依赖于base.js和util.js:

代码如下:

define(function(require, exports, module) {
var _ = require('base.js'), util = require('util.js');
var div_tabs = _.$('tabs');
// .... 其他代码
});

一个模块可以通过局部函数require获取其他模块的接口。此时,变量_和util都是局部变量,并且,变量名完全是受开发者控制的,如果你不喜欢_,那也可以用base:
代码如下:

define(function(require, exports, module) {
var base = require('base.js'), util = require('util.js');
var div_tabs = base.$('tabs');
// .... 其他代码
});

一旦要移除util.js、添加ui.js,那只要修改tabs.js就可以了:
代码如下:

define(function(require, exports, module) {
var base = require('base.js'), ui = require('ui.js');
var div_tabs = base.$('tabs');
// .... 其他代码
});

加载器

 

由于缺乏浏览器的原生支持,如果我们要用模块化的方式编码,就必须借助于一个叫做加载器(loader)的东西。

目前加载器的实现有很多,比如require.js、seajs。而JRaiser类库也有自己的加载器。

时间: 2024-12-28 03:26:44

了解Javascript的模块化开发的相关文章

详解JavaScript模块化开发_javascript技巧

什么是模块化开发? 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来js得到重视,应用也广泛起来了,jQuery,Ajax,Node.Js,MVC,MVVM等的助力也使得前端开发得到重视,也使得前端项目越来越复杂,然而,JavaScript却没有为组织代码提供任何明显帮助,甚至没有类的概念,更不用说模块(module)了,那么什么是模块呢? 一个模块就是实现特定功能的文件,有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块.模块开发

干货|大数据应用:前端模块化开发的价值

随着大数据将各行各业的用户.方案提供商.服务商.运营商以及整个生态链上游厂商融合到一个大环境中,大数据应用前端开发变得越来越复杂.最早JS(javascript)需求简单,是一种面向过程的写法,也就是写函数,后来引入面向对象的开发思想,到现在写成类.随着应用程序的增多,JS代码复杂度越来越高,如何管理.组织.优化成为摆在企业技术部门面前的一个现实问题. 模块化开发并不新鲜,但在 国内Web 领域,无论是前端开发还是新生岗位,都保留着比较落后的编码习惯.直到近年,随着各种前端框架的推广和流行,模块

在Html中使用Requirejs进行模块化开发实例详解_javascript技巧

在前端模块化的时候,不仅仅是js需要进行模块化管理,html有时候也需要模块化管理.这里就介绍下如何通过requirejs,实现html代码的模块化开发. 如何使用requirejs加载html Reuqirejs有一个text的插件,它可以读取指定文件的内容,读取到的内容就是文本. 如何下载text插件 第一种方法,可以通过npm下载: npm install requirejs/text 第二种方法,也可以直接去官方github上面直接下载. 直接拷贝内容到text.js中即可. 如何安装t

Seajs 简易文档 提供简单、极致的模块化开发体验_Seajs

非官方文档,整理来自己官方文档的文字与实例,方便速查. 为什么使用 Sea.js ? Sea.js 追求简单.自然的代码书写和组织方式,具有以下核心特性: 简单友好的模块定义规范:Sea.js 遵循 CMD 规范,可以像 Node.js 一般书写模块代码. 自然直观的代码组织方式:依赖的自动加载.配置的简洁清晰,可以让我们更多地享受编码的乐趣. Sea.js 还提供常用插件,非常有助于开发调试和性能优化,并具有丰富的可扩展接口. 兼容性 Sea.js 具备完善的测试用例,兼容所有主流浏览器: C

平台化三部曲之二模块化开发 - Google Guice 平台模块化开发的果汁

该文章来自阿里巴巴技术协会(ATA)精选集 在前文<从Eclipse平台看交易平台化>中,主要探讨平台的扩展机制. 本文将继续探讨平台化开发中另一个重要方面: 模块机制.在阿里系统开发中,大家都有自己的模块化开发方式.比如目前交易中的TMF框架(Trade Module Framwork)也是从模块化开发解决业务隔离扩展. Detail 2.0平台化项目中定义了一套自己的模块化方式.本文想通过介绍Guice Module的模块机制,介绍一种简单强大的模块开发解决方案,Guice在java开源软

osgi框架-Java web项目模块化开发

问题描述 Java web项目模块化开发 RT,请问如何把一个项目进行模块化开发,之前研究过OSGI框架,感觉太麻烦了 解决方案 一个是使用maven,对模块进行管理,跨项目复用模块http://my.oschina.net/kingfire/blog/273381 一个是使用spring ioc/aop,对类进行管理,依赖倒置,每人管一摊 一个是使用git,源代码管理,虽然和模块化没什么关系,但是源代码管理决定了模块化开发的流程 OSGI实在是太笨重了. 解决方案二: 所谓模块是指可组成系统的

JavaScript 设计模式与开发实践读书笔记

JavaScript 设计模式与开发实践读书笔记 最近利用碎片时间在 Kindle 上面阅读<JavaScript 设计模式与开发实践读书>这本书,刚开始阅读前两章内容,和大家分享下我觉得可以在项目中用的上的一些笔记. 我的 github 项目会不定时更新,有需要的同学可以移步到我的 github 中去查看源码: https://github.com/lichenbuliren/design-mode-notes 1.currying 函数柯里化 currying 又称 部分求值 .一个 cu

OYE - AMD模块化开发思想的实现原理及应用

问题描述 hi,大家,一切都别来无恙吧?^_^为了推行模块话的开发思想,将刚推出不久的-,拿出来跟大家分享一下,希望能够多尽一份力!是规范的一个分支,它更适合在浏览器端进行实现.是对的一个实现!OYE概述不依赖Scriptonload事件,更稳定可靠完美支持具名.匿名模块支持模块提取完整依赖列表支持模块循环依赖检测支持require与define在同一个文档OYE实现原理辅助项[[当前正在处理的模块名称]],[[请求队列]]definedefine函数执行时,如果是具名模块,则直接将模块定义体与

.net 模块化开发

问题描述 最近公司要重构之前的一个项目,之前采用三层架构的WEB开发,现在想把项目中的60+功能做成单一模块.在网上搜索了模块化开发后一知半解的,我理解如何做反射,如何做抽象层,但是模块化的话是不是说把每一个功能/模块新建一个项目?单个项目只对该模块负责?那么问题来了,我怎么组合页面呢?网上查的MEF貌似是针对数据处理层的.诚请教各位大神,有什么方法或者例子什么的我能参考一下. 解决方案 解决方案二:什么依赖倒置听上去高大上的很.说穿了解决方案其实简单到死:点击导航菜单时用反射动态加载业务模块.