自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

js大項目代碼的多人合作處理方法

開發(fā) 前端
js大項目代碼組織多人合作時會出現(xiàn)種種問題,編寫規(guī)范的隨意性 ,編寫風格的個性化,是js項目維護成本的很大一部分原因。

Js開發(fā)在整個行業(yè)的現(xiàn)狀主要的有兩點

維護成本高

多人協(xié)作項目的困境

Js項目維護成本過高

經(jīng)歷過10年的ie統(tǒng)治時期的瀏覽器世界一成不變,和06年開始ajax的興起帶動垂死的javascript的復興,瀏覽器市場也開始翻天覆地的快速變化,排版引擎和js腳本引擎開始得到不斷的優(yōu)化,js的執(zhí)行效率不斷的得到提高,但是………..

我們的js一直沒變過. 現(xiàn)在所有的主流 Web 瀏覽器都遵守 ECMA-262 第三版,即實現(xiàn)的是JavaScript 1.5版  時間 2000

那么,js依然是當年的js,瀏覽器和對web的需求早已經(jīng)不復當年。當年那個為做表單驗證而生的js語言,如今承擔的是復雜的界面ui和交互處理,以前只需要寫十幾行或者幾十行的js現(xiàn)在需要面對幾千上w行的需求。

那么帶來的問題就是十年來js語言特有的隨意性導致的各路js程序員的js風格各異。

Js的弱類型特性導致項目中經(jīng)常會出現(xiàn)jser的各種奇技淫巧。

上面的兩問題直接導致的是js程序交接維護上的困難。面對js風格清晰易懂的jser的代碼還好,如果接手js風格怪異太個性的jser的代碼,并且如果還沒有注釋,那么,看代碼真心會看到你吐血

編寫規(guī)范的隨意性 ,編寫風格的個性化,是js項目維護成本的很大一部分原因

多人協(xié)作項目的困境

其實看過前面的內(nèi)容,我們大抵的了解到,js是應很簡單的需求而生的,甚至簡單到是用來做簡單的表單驗證的。也就是說,js代碼,在很長一段時間內(nèi),都是由一個開發(fā)獨立完成的,多人協(xié)作上會出現(xiàn)的問題

1,全局變量命名混亂沖突導致系統(tǒng)錯誤

2,代碼集中少量文件導致開發(fā)效率降低

3,容易出現(xiàn)功能重復開發(fā)

Js開發(fā)編寫方式的演進

函數(shù):js作為函數(shù)式語言與生帶來的特性,jser們通過在window下注冊一個又一個的function相互調(diào)用來完成產(chǎn)品們的需求(全局變量命名極為混亂和不規(guī)范)

類:jser為大型js項目開發(fā)的嘗試, 2006年,Ajax興起。JavaScript絕地重生,越來越多的后端邏輯放到了前端。網(wǎng)頁中的JS代碼量急劇增加。這時寫函數(shù)方式組織大量代碼顯得力不從心。有時調(diào)試一個小功能,從一個函數(shù)可能會跳到第N個函數(shù)去。這時jser們前仆后繼,進行各樣嘗試,類出現(xiàn)了,Prototype 率先流行開來。用它組織代碼,用js的靈活性模擬類的編程,每個類都是Class.create創(chuàng)建的。又有YUI、Ext等重量級框架。雖然它們的 創(chuàng)建類方式各不同,但它們的設計終極目標卻都是要滿足大量JavaScript代碼的開發(fā)而努力

類開發(fā)嘗試的轉折-------這是一個戰(zhàn)火紛飛的年帶,各路框架豪杰不斷涌現(xiàn),jq的誕生帶來了js開發(fā)的又一次變革,jq所至,其他框架寸草不生,同時也直接導致 prototype 等“類”的嘗試又化為烏有,很大一幫jser轉投jq尤其是js新手直接著手jq者,在享受了jq在小型頁面dom操作的遍歷之后,大型js項目的多人協(xié)作和代碼組織問題又暴露到了臺前,甚至是制約js乃至整個web發(fā)展的一個不小的因素

那么,模塊化開發(fā)——現(xiàn)在,未來?

Commonjs,首先要說下這個。何為commonJS?commonJs可以理解成一個組織,他們中的所有人都致力于提高javascript程序的可移植性以及可交互性。在js模塊化開發(fā)上做各種的嘗試,這種可移植性以及可交互性不僅僅局限于瀏覽器端,而且也包括了服務器端的javascript, CommonJS 提出了一種用于同步或異步動態(tài)加載JavaScript代碼的API規(guī)范,非常簡單卻很優(yōu)雅,稱之為AMD(Modules/Asynchron , RequireJS和NodeJS的Nodules已經(jīng)實現(xiàn)了這個API,而Dojo也將馬上完全支持(Dojo1.6)。規(guī)范本身非常簡單,甚至只包含了一個API:

define([module-name?], [array-of-dependencies?], [module-factory-or-object]);

這個就是差不多的整個amd規(guī)范的定義。我們這里主要已requirejs為例做個簡單的說明

RequireJS快速入門-模塊定義

1.Simple Name/Value Pairs

2.Definition Functions

3.Definition Functions with Dependencies

4.Define a Module as a Function

5.Define a Module with Simplified CommonJS Wrapper

6.Define a Module with a Name

Simple Name/Value Pairs

定義的是一個簡單的鍵值對數(shù)據(jù)模塊ž

 
  1. //Inside file my/shirt.js:  
  2.  define({  
  3.     color: "black",  
  4.     size: "unisize“  
  5.  });  
  6.  

Definition Functions

定義的模塊包裝在一個function內(nèi) 

 
  1. define(function () {  
  2. //Do setup work here  
  3.     return {  
  4.        color: "black",  
  5.        size: "unisize“  
  6.  }  
  7.  }); 

Definition Functions with Dependencies

定義一個有模塊依賴關系的模塊

  1. //module in the same directory as shirt.js  
  2. define(["./cart", "./inventory"], function(cart, inventory) {  
  3.         //return an object to define the "my/shirt" module.  
  4.         return {  
  5.              color: "blue",  
  6.              size: "large",  
  7.              addToCart: function() {  
  8.                  inventory.decrement(this);  
  9.                  cart.add(this);  
  10.              }  
  11.         }  
  12. } );  

那么,執(zhí)行了這個模塊的初始化會依次的加載順序為

  1. my/cart.js  
  2. my/inventory.js  
  3. my/shirt.js 

Define a Module as a Function

定義的模塊為返回一個function

  1. define(["my/cart", "my/inventory"], function(cart, inventory) {  
  2.     //return a function to define "foo/title".  
  3.    //It gets or sets the window title.  
  4.    return function(title) {  
  5.       return title ? (window.title = title) : inventory.storeName + ' ' + cart.name;  
  6.    }  
  7. } ); 

Define a Module with Simplified CommonJS Wrapper

定義一個簡單的commonjs包裝

  1. define(function(require, exports, module) {  
  2.        var a = require('a'),  
  3.              b = require('b');  
  4. //Return the module value  
  5.        return function () {};  
  6.  } );  
  7.  

這個定義就可以把模塊內(nèi)部的任何變量暴露給exports來作為模塊的屬性提供。比如:

內(nèi)有個定義

  1. var name=‘nickli’; 

這個就僅僅是模塊的內(nèi)部私有變量,但是要想作為這個模塊的屬性提供就可以

  1. Exports.name=“nickli”;  

然后在require這個模塊的時候 就可以訪問到name這個屬性了

最后一點,也是比較重要的一點

Define a Module with a Name  給一個模塊設置一個名字,這個在多個模塊壓縮成一個文件的時候是必要的,因為否則模塊系統(tǒng)就找不到你壓縮的文件里面哪個模塊是哪個。而且這個name的定義 在你的開發(fā)環(huán)境中也要符合模塊文件的路徑,比如你的m模塊在a文件夾下,那么你的name 的定義也要是 a/m 

  1. //Explicitly defines the "foo/title" module:define("foo/title",  
  2.         ["my/cart", "my/inventory"],  
  3.         function(cart, inventory) {  
  4.             //Define foo/title object in here.  
  5.        }  
  6. ); 

模塊化后的加載

  1. <script data-main="scripts/main" src="scripts/require.js"></script> 

Require.js加載完畢后會自動去 拉取scripts/main.js

  1. //Inside scripts/main.js  
  2. require(["some/module", "a.js", "b.js"], function(someModule) { //... });  

會依次加載some/module.js   a.js b.js三個文件

模塊化后的新問題

目前nodejs的模塊系統(tǒng)是嚴格遵循的commonjs  規(guī)范實施的,但是要注意到,nodejs是運行在server端的,然而瀏覽器端編程和server的最大不同是server的所有模塊文件都是在server和主文件是一塊的。而瀏覽器要面對的是大量的模塊文件帶來的大量http請求的問題, 嗯, 這個問題在瀏覽器端是致命的。。。。。。。

不過我們有combo   動態(tài)文件壓縮技術,這里不詳述,前面已經(jīng)有一隨筆 講述 require來實現(xiàn)combo的支持

關于js的模塊化開發(fā)和amd相關資料,在http://www.cnblogs.com/snandy/里有不少更加詳細的資料。

原文鏈接:http://www.cnblogs.com/litao229/archive/2012/04/10/2440274.html

【編輯推薦】

1.分享30套免費的高質(zhì)量網(wǎng)頁按鈕素材

2.10個絕對讓你瘋狂的HTML5和JS實驗性展示

3.jQuery命名沖突解決的五種方案

4.12個必要的jQuery表單插件

5.一些非常棒的jQuery拖放插件

【責任編輯:張偉 TEL:(010)68476606】

 

責任編輯:張偉 來源: 李濤的博客
相關推薦

2013-04-23 15:31:28

大項目

2011-04-07 15:09:48

項目管理項目

2015-07-13 11:09:06

谷歌改變世界

2014-02-28 13:27:08

程序員代碼

2024-12-16 00:50:56

2011-04-28 08:59:20

項目框架

2022-04-27 08:24:04

項目管理群管理管控

2020-05-27 11:03:27

物聯(lián)網(wǎng)安全物聯(lián)網(wǎng)IOT

2022-10-09 08:48:13

配置化建造者參數(shù)

2024-01-12 19:12:46

2018-12-12 14:53:37

維諦技術

2020-10-15 16:27:26

騰訊TencentOS tTKEStack

2022-02-09 08:54:43

項目JavaScriptvite

2025-04-01 09:36:00

2020-10-26 13:55:53

數(shù)據(jù)人工智能區(qū)塊鏈

2024-05-06 07:30:00

機器狗AI

2021-01-14 11:05:41

項目配置屬性

2021-07-16 09:17:07

數(shù)字化

2019-04-08 15:53:37

戴爾

2016-09-02 16:13:05

項目
點贊
收藏

51CTO技術棧公眾號