JavaScript程式碼組織結構良好的5個特點
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>
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2641977/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何組織軟體模組的程式碼結構?
- rust 模組組織結構Rust
- 良好的編碼習慣 —— 5 個提高程式碼質量的技巧
- 好的Java架構具備的5個特點!Java架構
- 組織css程式碼CSS
- 乾淨程式碼的幾個特點 -Xebia
- 機器學習之良好特徵的特點機器學習特徵
- iOS 工程組織結構分享iOS
- 如何在word中製作組織結構圖 用word做組織結構圖
- JavaScript的組成結構梳理JavaScript
- 前端進階之養成一個良好的程式碼風格--JavaScript standard style前端JavaScript
- 程式碼模型組織方式模型
- 現代 JavaScript 教程 — 程式碼結構JavaScript
- SaaS公司組織結構圖 - David
- 組織架構新型資料結構思考架構資料結構
- 大資料的結構和特點大資料
- 你是如何組織html程式碼的?HTML
- Go包-程式碼組織者Go
- JavaScript中的程式結構和分支結構JavaScript
- 重構-改善既有程式碼的設計(六)–重新組織函式函式
- Redis 物件內部組織結構 —— 字典Redis物件
- 我們正在錯誤的組織程式碼!
- objective-C 的程式碼檔案組織Object
- LR.Java低程式碼自主搭建企業組織架構Java架構
- 如何組織大型 Rust 程式碼庫Rust
- Vue(12)元件的組織結構和元件註冊Vue元件
- 組織結構圖是什麼?怎樣繪製結構圖?
- python元組的特點Python
- [轉] 淺析x86架構中cache的組織結構架構
- CSS樣式規則-CSS結構的特點CSS
- 重構你的javascript程式碼JavaScript
- Docker容器體系結構及特點Docker
- SAP SD基礎知識之組織結構
- 什麼是高彈性組織結構? – Jessitron
- JavaScript 的資料結構和演算法 - 連結串列程式碼篇JavaScript資料結構演算法
- Golang, 以 9 個簡短程式碼片段,弄懂 defer 的使用特點Golang
- 組織: 階級: 組織+管理+授權+組織結構設計+ 角色 + 分工: individual型別: 體力+普工+文職+型別
- 網站SEO如何構建良好的樹狀結構呢?網站