`

JavaScript重构(一):模块划分和命名空间

阅读更多

通常我们的团队中,开发人员在Java语言层面具备相当的技术素养,经验丰富,而且有许多成熟的、合理的规约,类型繁多的代码隐患检查工具,甚至在团队间还有计划内的评审和飞检。但是前端的代码不似后台,就像一个没人疼的孩子,不仅仅容易被低估、被轻视,导致质量低劣、可维护性差,技能上,更缺少优秀的前端开发人员。

JavaScript是前台代码中重要组成部分,随着版本的延续,产品越做越大,JavaScript层面的重构,需要在整个过程中逐步强化起来。

 

当代码量达到一定程度,JavaScript最好能够与页面模块组件(例如自定义的FreeMarker标签)一起被模块化。

模块化带来的最大好处就是独立性和可维护性,不用在海量的js中定位问题位置,简单了,也就更容易被理解和接受,更容易被定制。

模块之间的依赖关系最好能够保持简单,例如有一个common.js,成为最通用的函数型代码,不包含或者包含统一管理的全局变量,要求其可以独立发布,其他组件js可以轻松地依赖于它。举个例子,我们经常需要对字符串实现一个trim方法,可是js本身是不具备的,那么就可以在这个common.js中扩展string的prototype来实现,这对外部的使用者是透明的。

 

使用命名空间是保持js互不干扰的一个好办法,js讲究起面向对象,就必须遵循封装、继承和多态的原则。

参照Java import的用法,我希望命名空间能带来这样的效果,看一个最简单的实例吧:

我有一个模块play,其中包含了一个方法webOnlinePlay,那么在没有import这个模块的时候,我希望是js的执行是错误的:

webOnlinePlay(); //Error! 无法找到方法

 

但是如果我引入了这个模块:

import("play");

webOnlinePlay(); //正确,能够找到方法

 

其实实现这样的效果也很简单,因为默认调用一个方法webOnlinePlay()的实质是:window.webOnlinePlay(),对吗?

所以在import("play")的时候,内部实现机制如下:

var module = new playModule();

 

对于这个模块中的每一个方法,都导入到window对象上面,以直接使用:

window[methodName] = module[methodName];

 

其实这里并没有什么玄机,但是这种即需即取的思想却给前端重构带来了一个思路,一个封装带来的可维护性增强的思路,不是吗?

 

聪明的你也许还会提到一个问题:

如果我没有import这个play模块,这个页面都不需要,那我能否连这个play.js都不加载呢?

当然可以,请关注后面的分解——关于js的动态加载的部分。

 

文章系本人原创,转载请注明作者和出处

分享到:
评论
2 楼 RayChase 2011-12-27  
greatghoul 写道
window[methodName] = module[methodName];  

请问,这样的话,不是会导致覆盖吗,如果模块Foo中有play方法,模块Bar了有play方法,都加载到window中,就冲突了呀,这样分的命名空间不就没有意义了么?

是的,所以需要根据实际情形来选择合适的办法,上面的这个办法好处在于可以让方法的调用变得简单,如果遇到你的问题,请引入相应的对象调用方法。
1 楼 greatghoul 2011-12-27  
window[methodName] = module[methodName];  

请问,这样的话,不是会导致覆盖吗,如果模块Foo中有play方法,模块Bar了有play方法,都加载到window中,就冲突了呀,这样分的命名空间不就没有意义了么?

相关推荐

    Javascript重构.pdf

    首先,模块划分和命名空间是JavaScript重构的基础。随着项目的扩大,将JavaScript代码组织成模块有助于降低耦合度,提升代码的独立性和可维护性。模块化意味着每个功能或组件都有自己的独立作用域,避免全局变量冲突...

    Javascript重构.docx

    首先,模块划分和命名空间是JavaScript重构的关键部分。模块化允许我们将代码分解成独立、可复用的单元,每个单元专注于特定的功能。这样做可以减少代码间的耦合,使得定位和修复问题变得更加容易。例如,我们可以...

    webui2重构规范

    2. **css文件夹**:存放所有样式表文件,可以按模块划分子目录。 3. **html文件夹**:存放所有HTML页面,按照页面类型或功能组织。 4. **js文件夹**:存放JavaScript源码,可按模块或功能进行分层。 五、**Jsp/html...

    编写可维护的JavaScript.((美)Nicholas C. Zakas).[PDF.pd

    11. **代码审查和团队协作**:一个有效的代码审查过程可以帮助团队识别代码中的问题,并分享知识。本书将提出一些代码审查的最佳实践,以促进团队协作和知识共享。 12. **使用工具和技术**:现代JavaScript开发中,...

    JS前端框架关于重构的失败经验分享

    接着,作者试图创建一个命名空间,以避免全局变量污染和潜在的命名冲突。他们研究了JavaScript的面向对象和原型链,并尝试使用原型模式来实现。最终,作者决定采用一个全局对象(如`Gssl`)来存储所有控件,作为实现...

    gorestaurant:为研究而开发的项目-挑战“重构”

    1. **代码结构优化**:查看代码组织是否遵循良好的命名规范,模块划分是否合理,是否存在过长的函数或类。 2. **依赖管理**:分析项目如何使用npm(Node Package Manager)管理外部依赖,是否有不必要的依赖,或者...

    编写高质量代码-Web前端开发修炼之道.azw3

    4.4.2 CSS的命名——命名空间的概念 4.4.3 挂多个class还是新建class——多用组合,少用继承 4.4.4 如何处理上下margin 4.5 低权重原则——避免滥用子选择器 4.6 CSS sprite 4.7 CSS的常见问题 4.7.1 CSS的...

    Vue.js 组件编码规范

    - **命名空间**:如果组件是通用的,可以用一个单词命名并加上`app-`前缀作为命名空间,以便在其他项目中复用。 - **组件调用**:组件名应该简短、有意义且具有可读性,通常由2到3个单词组成。 ### 组件表达式简化 ...

    Modular-Design:在gh页上实时查看GitBook

    良好的模块划分还可以减少代码间的耦合,降低维护成本。 3. **可读性**:清晰的模块结构有助于代码的可读性。每个模块专注于一个特定的功能,使其他开发者更容易理解代码的意图。此外,命名规范和注释的使用也能...

    源程序.zip

    源程序"这个压缩包子文件的文件名称中,我们可以推测这可能包含了一组按照项目或者模块划分的源代码文件。通常,源代码文件的命名遵循一定的规范,例如:".c"表示C语言源文件,".cpp"代表C++源文件,".java"用于Java...

    WEB标准心得之网页重构的思路

    网页重构是一种优化网页结构、提高可维护性和性能的过程。在"WEB标准心得之网页重构的思路"中,作者分享了自己的重构方法,主要基于REST、Grid和DRY(Don't Repeat Yourself)原则。以下是对这些知识点的详细说明: ...

    中小型项目前端架构.docx编程资料

    - **低耦合高内聚**:保持各模块间的低耦合和内部的高内聚有助于提高代码的可维护性。 - **可控变化**:确保修改一处代码不会意外地影响其他部分的功能。 - **示例分析**:例如,修改某个页面组件不应该导致其他页面...

    simple-test-and-modular-patterns:Code Fellows sea-d30 TDD 和模块化模式

    "simple-test-and-modular-patterns: Code Fellows sea-d30 TDD 和模块化模式"这个项目,显然是为了教授如何在JavaScript环境中运用这两种方法。 测试驱动开发(TDD)是一种编程策略,开发者首先编写测试用例,确保...

    基于 React 的企业管理系统开发经验,带你学习如何抽象复杂业务逻辑,帮助团队实现效能提升.pdf

    2. **组件设计**:根据业务逻辑划分功能模块,设计合理的组件结构。 3. **状态管理**:合理利用Redux或Context API等状态管理工具,确保数据流清晰可控。 4. **代码重构**:持续优化代码结构,提高复用性和可维护性...

    GameStoredTwo:原始MVC的重建

    为了实现这一目标,我们可以创建不同的模块或命名空间,分别存放模型、视图和控制器的代码。此外,利用模块化和面向对象的特性,可以创建可复用的组件,提高代码的可维护性。 在GameStoredTwo-main目录下,我们可能...

    很一般很简单的航空订票

    非常乱."提示我们,这个项目可能没有遵循良好的编程规范和代码组织原则,例如模块化、函数划分、命名规则等。这对于后期维护和扩展来说是不利的。"虽然我已经备注了"表明代码中可能有一些注释,但可能并不足以完全...

    第11章 全局属性和其他

    模块化是另一种重要的编程技术,它通过将大型代码库划分为较小、更易管理的部分来提高可读性和可维护性。在Python中,模块可以是包含函数、类和变量的.py文件;在Node.js中,模块则是使用require()函数导入的.js文件...

    商品订购类型

    在商品订购系统中,这可能体现在良好的命名规范、合理的函数划分以及避免冗余代码等方面。 接着,我们要了解“完善”的含义。一个完善的商品订购系统应该包括用户接口、订单处理、库存检查、支付接口、物流跟踪等多...

    nthn.crlsn.io:我的个人网站

    5. 更好的模块系统:TypeScript 采用ES6模块系统,支持命名空间和导入导出,便于代码组织和重用。 【nthn.crlsn.io-develop】这个压缩包文件名称暗示了它是网站的开发版本。通常,"develop"分支是开发人员进行日常...

    EECS-351-Project-C

    【标签】"JavaScript" 指出这个项目的核心技术是JavaScript,一种广泛用于网页和网络应用的脚本语言。JavaScript不仅用于网页交互,还可以在服务器端(Node.js)、移动设备、游戏开发等多个领域发挥作用。学生可能...

Global site tag (gtag.js) - Google Analytics