博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
好程序员分享JavaScript代码组织结构良好的5个特点
阅读量:5960 次
发布时间:2019-06-19

本文共 3683 字,大约阅读时间需要 12 分钟。

 
 
JavaScript代码组织结构良好的5个特点,随着JavaScript项目的成长,如果你不小心处理的话,他们往往会变得难以管理。我们发现自己常常陷入的一些问题: 当在创建新的页面时发现,很难重用或测试之前写的代码。
  当我们更深处地研究这些问题,我们发现根本原因是无效的依赖管理造成的。比如,脚本
A依赖脚本B,并且脚本B又依赖脚本C,当C没有被正确引入时,整个依赖链就无法正常工作了。
  为了解决这个问题,我们已经采取了异步模块定义
(AMD)的模式,并引入require.js到我们的技术堆栈。经过对AMD的进一步探索,我们已经基本确定,组织严密的JavaScript一般都呈现以下五个特点:
  始终声明我们的依赖
为第三方代码库添加
shim(垫片) 定义跟调用应该分离 依赖应该异步加载 模块不应依赖全局变量
  让我们详细讨论一下。
  始终声明我们的依赖
  我们最常碰到了的一个问题是,我们会经常忽略那些会被确定加载的依赖项。举例来说,如果我们创建了一个
jQuery插件,一般认为没有必要申报jQuery的依赖,因为它在大多数页面都是默认装载的。虽然这似乎适用于大多数的网页,但当我们试图进行单元测试或在一个全新的页面加载时,它就变成一个问题。
  始终声明我们的依赖,我们就消除了
JavaScript中90%的问题。可重用的代码变得更可靠,单元测试的数量增加了4倍也是一个因素。
  为第三方代码库添加
shim(垫片)
  在管理
JavaScript依赖时经常碰到的一个有趣问题是,较旧的第三方库可能无法和您的依赖关系管理系统配合工作。例如,你们内部使用了jQuery的一个很酷的插件,但它对require.js一无所知。这会成为一个问题,因为第一个特点,我们来添加对这个插件的引用。
  解决的办法是通过依赖管理工具为这个插件制作一个垫片。在
require.js中,这可以很容易地通过配置来完成:
 
 
var require = {

1. <p><font size="3">  "shim": {</font></p>

2. <p><font size="3">  "lib/cool-plugin": {</font></p>

3. <p><font size="3">  "deps": ["lib/jquery"]</font></p>

4. <p><font size="3">  }</font></p>

5. <p><font size="3">  }</font></p>

6. <p><font size="3">  }</font></p>

  有了这个简单的配置,每一个加载
lib/cool-plugin.js 的脚本都会自动加载jQuery。将有助于满足所有相关性.
  最终的结果是代码更容易测试和重用,因为你总是有一个
require()来调用所需的功能。
  定义跟调用应该分离
  这是限制
JavaScript代码的可重用性和可测试性的一个常见问题。问题表现在一个单一的文件即定义了一个类/函数又调用了它。考虑下面的代码:
  
## js/User.js

1. <p><font size="3">  define(functino(require) {</font></p>

2. <p><font size="3">  var User = function(name, greeter) {</font></p>

3. <p><font size="3">  this.name = name;</font></p>

4. <p><font size="3">  this.greeter = greeter;</font></p>

5. <p><font size="3">  };</font></p>

6. <p><font size="3">  User.prototype.sayHello = function() {</font></p>

7. <p><font size="3">  this.greeter("Hello, " + this.name);</font></p>

8. <p><font size="3">  };</font></p>

9. <p><font size="3">  var user = new User('Alice', window.alert);</font></p>

10. <p><font size="3">  user.sayHello();</font></p>

11. <p><font size="3">  });</font></p>

  在这个例子中,一个单一的文件即定义了
User类又调用它。这将很难重用这个代码,因为只要加载这个脚本就会出现alert。同样greeter这个非常难以测试。
  解决的办法是保持定义和执行的分离。这有助于确保可重用性和可测性:
 
 
## js/User.js

1. <p><font size="3">  define(functino(require) {</font></p>

2. <p><font size="3">  var User = function(name, greeter) {</font></p>

3. <p><font size="3">  this.name = name;</font></p>

4. <p><font size="3">  this.greeter = greeter;</font></p>

5. <p><font size="3">  };</font></p>

6. <p><font size="3">  User.prototype.sayHello = function() {</font></p>

7. <p><font size="3">  this.greeter("Hello, " + this.name);</font></p>

8. <p><font size="3">  };</font></p>

9. <p><font size="3">  return User;</font></p>

10. <p><font size="3">  });</font></p>

11. <p><font size="3">  ## js/my-page.js</font></p>

12. <p><font size="3">  define(functino(require) {</font></p>

13. <p><font size="3">  var User = require('js/User');</font></p>

14. <p><font size="3">  var user = new User('Alice', window.alert);</font></p>

15. <p><font size="3">  user.sayHello();</font></p>

16. <p><font size="3">  });</font></p>

  这种变化,
User类可以安全地在许多脚本中重用。
  依赖应该异步加载
  因为试图同步加载脚本会导致浏览器锁死,这是非常重要的,你的脚本和你的模块应该使用异步加载机制。
Require.js在默认情况下,所有异步加载你的模块,只有所有的的依赖都加载完以后才会执行你的模块代码的函数。
  通过使用一个闭包,我们可以进一步利用
“use strict”的好处。
  模块不应依赖全局变量
  为了进一步加强我们的
JavaScript代码库,我们已经(几乎)完全消灭了全局变量(除了由require.js提供的全局变量,如require()和define())。全局变量是臭名昭著的潜在的进入模块的“隐藏的依赖关系”,它会使代码很难重用或测试。
  
Require.js也让我们转换第三方全局变量,require() - 通过垫补功能能模块。在这个例子中,lib/calculator 创建一个全局的计算器对象,这个库是被require化的。
 
 
var require = {

1. <p><font size="3">  "shim" : {</font></p>

2. <p><font size="3">  "lib/calculator": {</font></p>

3. <p><font size="3">  "export": "Calc"</font></p>

4. <p><font size="3">  }</font></p>

5. <p><font size="3">  }</font></p>

6. <p><font size="3">  }</font></p>

转载地址:http://gzfax.baihongyu.com/

你可能感兴趣的文章
MySql的安装
查看>>
同时开左右两个SAPGUI编辑器显示同一段ABAP代码
查看>>
无法在Chrome浏览器中查看SCCM SSRS报告
查看>>
mongoDB副本集的搭建
查看>>
ORA-01045: user ICCS lacks CREATE SESSION privilege; logon denied
查看>>
Android官方开发文档Training系列课程中文版:手势处理之监测通用手势
查看>>
python 网络编程
查看>>
vCenter的安装与部署
查看>>
明略数据吴明辉:AI商业化的核心是让用户合理接受机器的错误
查看>>
自定义View实例(二)----一步一步教你实现QQ健康界面
查看>>
Frame-relay 综合实验-4
查看>>
这个算法告诉你点链接会泄露多少秘密,帮你判断该不该点
查看>>
Gradle2.0用户指南翻译——第五章. 疑难解答
查看>>
make[1]: *** [/usr/local/pcre//Makefile] Error 127
查看>>
数据库内核月报 - 2017年12月
查看>>
killws 利用xfire部署webservice (xfire1.6+spring1.6+maven 进化版)
查看>>
【ZooKeeper Notes 27】ZooKeeper管理员指南——部署与管理ZooKeeper
查看>>
关于Exchange Server 2010中无法装入指定的数据的解决方法
查看>>
数据链路层的主要功能与服务
查看>>
Exchange server 2016 无人值守安装
查看>>