Package.js项目地址:http://code.google.com/p/package-js/ 原文地址:http://jamcode.iteye.com/blog/1517279
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代码:  1 Package.define("Root.ui.Button",["Root.ui.Pane","Root.util.Tpl","Root.util.Event"],
2 function (Pane,Tpl,Event) {
3     //Pane为Root.ui.Pane
4     //Tpl对应Root.util.Tpl
5     //依此类推
6     //.....
7 }); 
与CommonJS的AMD规范不同,在Package.js的语法中,一个JS模块,不但可以依赖其它JS包,还可以依赖CSS及HTML模板文件、及其它的JSON数据文件,并在运行时,获取到依赖的其它文件的内容。定义语法如下:
 1 Package.define("NS.ui.Button",["MT.ui.Component"],
 2 {
 3    tpl:"tpl.html",
 4    _style:"style.css"
 5 },function (Component) {
 6     //通过this.assets.tpl访问tpl.html内容
 7     var bgImgUrl=this.path+"img/bg.png",tpl=this.assets.tpl;
 8     function Button(opt) {
 9         //也可以通过当前Package对象的_pkgMeta_属性访问assets
10         this.tpl=String2Dom(opt.tpl || Button._pkgMeta_.assets.tpl);
11     }
12     return Button;
13 })  
在浏览器中,可以使用下面的方法导入一个JS模块, 
在导入的过程中,Package.js自动帮您做了后勤工作:1、加载这个模块的依赖模块。2、加载依赖的HTML及CSS文件。  
1 Package.imports(["Root.ui.Button"],function (Button) {
2     var btn=new Button();
3     btn.renderTo(document.body);
4 });
 在开发时,为了模块化,您需要将JS分成一个一个小的模块文件,但发布到生产环境时,为了加载速度上的考虑,您需要将这些JS文件合并成单个的JS文件并压缩,同样,CSS文件也要合并到一起。 
1 //您的打包配置文件
2 //build-config.json文件内容
3 {
4     "staticUrls":     {"defaults":"http://statics.iwt.macrotarget.com/jslibs/"},
5     "nsconfs":["http://www.cnblogs.com/statics/jslibs/XLib/_nsconf_.js"],
6     "includes":["XLib.apps.MainApp","XLib.ui.*"],
7     "compress":true //使用UglifyJS和UglifyCSS进行压缩
8 } 
借助Package.js,完成这个功能,您只需要写三四行JSON配置代码,执行一个命令,就一切OK了。  
1 #执行命令
2 build.js build-config.json   js    all.min.js
3 build.js build-config.json   css   all.min.css
4 #腰不酸了,腿不疼了!
  引用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^