Package.js項目地址:http://code.google.com/p/package-js/
Package.js是一個很方便的JavaScript包依賴管理及Make工具。它的設計目標是使瀏覽器端的JavaScript Component/App 開發更加模組化。如果您只是在開發一個小型的網站,只會混雜在HTML中寫幾行JS代碼用於改善一下使用者體驗,那麼Package.js也許並不適合您。如果您正在開發一個中到大型的WebApp,有幾十甚至幾百幾千個JS檔案和CSS檔案、HTML模板檔案,如果您正在為管理這些JS模組之間的依賴和載入而煩惱,為發布到生產環境時將JS檔案合并打包而寫Makefile寫得頭暈,那麼,Package.js,這就是你想要的!趕快來瞭解並使用Package.js吧!
Package.js主要包含兩個部分
運行在瀏覽器中的,用於define及import模組的JS庫API
運行在node.js環境,將所有JS包及其依賴的CSS及HTML檔案合并的make工具
Package.js瀏覽器端的API參照了CommonJS/AMD規範,相容此規範的最簡單形式,並在此基礎擴充了一些文法,以便於開發包含CSS及HTML模板的JavaScript UI組件。
直接來看一下使用Package.js開發的項目的目錄結構吧,簡單明了: 複製代碼 代碼如下:Test
├── dom
│ └── Style.js #命名空間為Test.dom.Style的模組檔案
├── init.js #根命名空間初始設定檔案
├── _nsconf_.js #Package.js會讀取的設定檔
├── ui
│ ├── Button
│ │ ├── img
│ │ │ └── bg.png
│ │ ├── init.js #Test.ui.Button命名空間的模組檔案
│ │ ├── style.css #UI組件的CSS檔案
│ │ └── tpl.html #UI組件的HTML模板檔案
│ └── Form
│ ├── init.js
│ ├── style.css
│ └── tpl.html
├── util
│ └── Cookie.js #命名空間為Test.util.Cookie的JS包
└── _xproxy_.html -> ../Package/_xproxy_.html #此檔案為Soft Link指向Package.js源碼中的Package/_xproxy_.html,用於跨域載入HTML模板檔案
使用Package.js,模組的定義文法——
Root/ui/Button/init.js代碼: 複製代碼 代碼如下:Package.define("Root.ui.Button",["Root.ui.Pane","Root.util.Tpl","Root.util.Event"],
function (Pane,Tpl,Event) {
//Pane為Root.ui.Pane
//Tpl對應Root.util.Tpl
//依此類推
//.....
});
與CommonJS的AMD規範不同,在Package.js的文法中,一個JS模組,不但可以依賴其它JS包,還可以依賴CSS及HTML模板檔案、及其它的JSON資料檔案,並在運行時,擷取到依賴的其它檔案的內容。定義文法如下: 複製代碼 代碼如下:Package.define("NS.ui.Button",["MT.ui.Component"],
{
tpl:"tpl.html",
_style:"style.css"
},function (Component) {
//通過this.assets.tpl訪問tpl.html內容
var bgImgUrl=this.path+"img/bg.png",tpl=this.assets.tpl;
function Button(opt) {
//也可以通過當前Package對象的_pkgMeta_屬性訪問assets
this.tpl=String2Dom(opt.tpl || Button._pkgMeta_.assets.tpl);
}
return Button;
})
在瀏覽器中,可以使用下面的方法匯入一個JS模組,
在匯入的過程中,Package.js自動幫您做了後勤工作:1、載入這個模組的相依模組。2、載入依賴的HTML及CSS檔案。 複製代碼 代碼如下:Package.imports(["Root.ui.Button"],function (Button) {
var btn=new Button();
btn.renderTo(document.body);
});
在開發時,為了模組化,您需要將JS分成一個一個小的模組檔案,但發布到生產環境時,為了載入速度上的考慮,您需要將這些JS檔案合并成單個的JS檔案並壓縮,同樣,CSS檔案也要合并到一起。 複製代碼 代碼如下://您的打包設定檔
//build-config.json檔案內容
{
"staticUrls": {"defaults":"http://statics.iwt.macrotarget.com/jslibs/"},
"nsconfs":["http://www.cnblogs.com/statics/jslibs/XLib/_nsconf_.js"],
"includes":["XLib.apps.MainApp","XLib.ui.*"],
"compress":true //使用UglifyJS和UglifyCSS進行壓縮
}
藉助Package.js,完成這個功能,您只需要寫三四行JSON配置代碼,執行一個命令,就一切OK了。 複製代碼 代碼如下:#執行命令
build.js build-config.json js all.min.js
build.js build-config.json css all.min.css
#腰不酸了,腿不疼了!
引用
PS:build.js還幫您做掉一個小事:將CSS檔案中的background:url()之類的相對路徑轉換成絕對URL。您在開發時,CSS中url()始終只需要寫相對路徑,在部署到生產環境時,build.js合并後的CSS會自動將其轉換成絕對URL。甚至,如果你有使用IE6 Png AlphaImageLoader濾鏡,使用wui4ie6的loader,您在開發時仍然可以在src=裡寫相對路徑,在開發模式下,Package.js也會自動產生使用絕對URL的CSS Rule,在打包時也會對 AlphaImageLoader的src作轉換,CSS中永遠不需要寫絕對URL
Package.js相比於其它模組載入器及AMD實現(RequireJS,SeaJS...)有什麼優勢或缺點?
Package.js是面向Web App Framework開發,定義文法及檔案目錄結構較嚴格(或者說稍顯複雜),只使用AMD規範中最簡單的一種define文法
Package.js將JS模組對CSS及HTML檔案的依賴與對其它JS模組的依賴在define寫法上區分開來,並且在build.js中也包含了對CSS、HTML、JSON打包的處理
(TOT)包含對IE6 CSS的特殊照顧(沒辦法,我們自己的項目需要)
增加PackageMeta,一個JS模組在運行時可以知道自己的URL
...如果算缺點的話:不與CommonJS AMD規範完全相容
build時支援三種匯出模式:includes,deps,all
開發模式下更方便:使用_xproxy_.html跨域載入,無需代理。使用_nsconf_.js,無需配置paths。
聽完這些簡單的介紹或許您對Package.js已經躍躍欲試了,在使用之前,您可以參考下
Package.js的詳細文檔:http://package-js.googlecode.com/hg/docs/Package.html。
好!不要再用落後的方式開發JavaScript App,不要再做Out Man,趕快使用Package.js吧 ^O^