领导力大挑战
在实施Scrum项目的过程中,Scrum Master的角色是相当关键的,因为他是团队的推动者。本文围绕什么是仆人式领导、仆人式领导的起源、如何将领导力传达给团队、Scrum Master作为仆人式领导者的角色展开叙述,同时重点阐述仆人式领导者应有的基本内外特征。
该内容已经被标记书签!
标记书签错误,请重试!

作者 王沛 发布于 2011年9月2日
Build系统是产品正式发布的最后一道工序,其效率和质量直接决定着最终产品的效率和质量。虽然在传统应用中,Build系统已经相当成熟,但在Web领域,依然是八仙过海,各显神通,甚至不经Build就直接上线的也比比皆是。Web系统的零散性、复杂性,也决定了对其进行Build是一件复杂的事情。但通过Dojo,我们认识到了一款开源的Web应用Build系统:bdBuild,也见识了其强大的功能。它是一个独立的通用Build系统,完全用JavaScript写成,可以运行于NodeJS或者Rhino等JavaScript引擎,理论上可以对任何Web应用进行Build。下面就将介绍Dojo中是如何用bdBuild系统来实现Web应用的Build的。以此为起点,你也可以利用bdBuild实现自己的Web应用Build系统,对非Dojo的应用来进行打包。
bdBuild是一套开源的前端应用Build引擎,完全用JavaScript写成,可运行于Node.js,Rhino等JavaScript引擎。其强大的功能和灵活可扩展的架构使得其能够应用于任何Web应用的打包。Build在传统应用中可以翻译为构建,而在Web中,也许翻译成打包更加适合。一个合格的Web Build系统至少应该能够完成以下几件事情:
基本上来说,这些工作的最终目的都是为了提高性能,Http协议的特性决定了多次请求取得多个小文件的效率远低于一次请求一个大文件。所以Web Build的首要目标就是合并小文件形成一个大文件。为了实现这些通用功能,bdBuild系统将Build的过程分为以下几个步骤:
虽然当前bdBuild系统仍然处于alpha测试阶段,但是Dojo已经对其进行完善和封装,形成了自己的Build系统,在已经发布的Dojo 1.7 beta版本中,我们已经可以使用它来进行Web应用的打包。
要使用Dojo的Build系统,首先需要下载源码版的Release包,在util/build下就是build相关的工具:

Dojo 对bdBuild系统进行了相当程度的封装,使得针对Dojo的打包变的更加容易,通过引入层(layer)的概念,可以很方便的指定哪些模块应该被压缩到同一个JavaScript文件。同时,Dojo Build系统还会自动把其它文件拷贝到目标文件夹,每个JavaScript文件或者CSS文件都会同时被压缩。下面的代码说明了layer的作用:
<script type="text/javascript" src="/dojoroot/dojo/dojo.js"></script> <script type="text/javascript" src="/dojoroot/dijit/dijit.js"></script> <script type="text/javascript" src="/js /mylayer.js"></script>
这是在页面中引入JavaScript的一段典型代码,其中dojo.js, dijit.js和mylayer.js就是在build系统中配置的3个layer,它们都包含了所有各自需要的代码。通过layer的方式,能够把页面需要的多个JavaScript文件打包成一个,加快了页面的载入速度。layer是在Build的配置文件profile中指定的,如下面的介绍。
通常一个完整的系统会不只有一个layer,而且对于同一页面,也有可能需要多个layer。所以,Dojo定义了profile这个概念,来描述整个打包的配置和参数。。在dojoroot/util/buildscripts/profiles/下可以看找到系统自带的一些profile文件,它们用于打包标准的dojo.js和dijit.js等等。一个典型的profile文件示例如下:
dependencies = {
layers: [
{
name: "dojo/dojo.js",
dependencies: [
"dijit._Widget",
"dijit._Templated",
"dojo.fx",
"dojo.NodeList-fx"
]
}
],
prefixes: [
[ "dijit", "../dijit" ],
[ "dojox", "../dojox" ],
[ "myNamespace", "~/src/myNamespace" ]
]
}
文件中定义了一个全局对象dependencies。包含2个必须属性:layers和prefixes。在layers数组中,可以定义多个layer。每个layer的name属性表明了输出的文件,是一个相对于releaseDir(后面介绍如何指定)的相对路径。dependencies数组包含了这个layer需要的模块。Build系统会去递归寻找所有依赖的模块并将它们全部打包进来。
另一个属性是prefixes数组,其中定义的是模块映射关系,它告诉系统到哪里去寻找一个Dojo模块。其作用和应用代码中使用的 dojo.registerModulePath是一样的。Prefixes中的每个元素也是一个数组,包含两个元素,前面是模块前缀,比如 “dijit”,后面一个是相对于util/路径的相对路径,比如“../dijit”。
有了这个profile,我们就可以来进行打包了。在Dojo中,是通过util/build/build.js来完成的。因为Build系统自身的代码都是JavaScript,因此需要一个JavaScript运行环境,现在同时支持的是NodeJS和Rhino。前者通常需要Linux或者 Cygwin环境,后者则需要Java环境的支持。NodeJS比Rhino运行速度快的多,条件允许的话,大家尽可能用NodeJS来进行build。下面的代码演示了如何开始一个build:
使用NodeJS:
node dojoroot/dojo/dojo.js load=build [options]
使用Java:
java -Xms256m -Xmx256m -jar path/to/util/shrinksafe/js.jar path/to/dojo/dojo.js baseUrl=path/to/dojo load=build [options]
可以看到,build.js文件接受多个参数(options),完整的参数列表可以通过指定—help参数来获取,比如releaseDir指定了要输出 build结果的文件夹。Action指定了要执行的操作序列,例如action=clean,check,release。当然还有一个最关键的参数:profile,它指定了打包的配置文件,从而控制整个打包的过程。例如:
Node dojoroot/dojo/dojo.js load=build profile=/home/dojo/my.profile.js action=check,release
这里的profile可以是如下多种类型:
命令行的完整参数如下面的表格所示:
| 参数 | 描述 |
| --build <filename> | 指定进行build control的脚本。 |
| --profile <filename> | 指定profile文件。 |
| --action | 指定要执行哪些操作,比如check, clean, release。 |
| --releaseDir | 输出build结果的文件夹。 |
| --version | 指定版本号。 |
一个profile中可以有多个layer。Layer的配置参数除了上面介绍的name和dependencies之外,还有一个属性非常有用,那就是:layerDependencies。它指定了所依赖的layer,所有出现在指定layer中的模块,都不会被包含在当前模块中。例如,假设有2个页面P1和P2,他们所共用的代码被打包进layerA,各自特殊的则被打包进layerB和layerC。那么在描述layerB和layerC时就可以指定他们的layerDependencies为layerA,从而layerA中的代码只会被用户load一次,提高了加载速度。而所有的layer 都回隐含的依赖于标准的dojo.js layer。所以在dojo.js中出现的代码是不会出现在其它的layer中的。
除此之外,layer还支持以下可选属性:
| copyrightFile | 指定一个包含版权信息的文本文件,其内容将被包含在生成的layer文件中。 |
| customBase | 前面提到所有layer会依赖于标准的dojo.js。这个属性可以改变这个默认行为,改为依赖于一个定制的dojo.js。可能的场景是,你需要的是一个更小的dojo.js。比标准的小很多。 |
| keepRequires | 一个数组,包含需要在运行是require的模块。Dojo中可以用dojo.require()来引入一个module,在build的时候会直接在layer中引入这些module。如果你需要让某些文件需要时再require,可以在这个参数中指定。 |
| discard | 布尔类型。表示当前layer是否需要写入一个文件。默认为false,即一个layer当然要被写入一个单独的文件。但在某些情况下,一些layer只会作为其它layer的依赖而存在,这时此参数可以设置为true。 |
bdBuild 是一个灵活、可扩展的开源build系统,使用JavaScript写成,并运行于Node.js, Rhino等JavaScript环境。非常适合前端人员创建自定义的打包过程。Dojo自带的build系统就是基于bdBuild,本文简要介绍了其原理和用法,虽然对于一般的Dojo开发这已经足够,但是如果要深入理解bdBuild,甚至开发其中的插件,仍然需要更多深入的了解。有兴趣的同学可以参考其文档,继续学习。
参考资料:
感谢张凯峰对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家加入到InfoQ中文站用户讨论组中与我们的编辑和其他读者朋友交流。
在实施Scrum项目的过程中,Scrum Master的角色是相当关键的,因为他是团队的推动者。本文围绕什么是仆人式领导、仆人式领导的起源、如何将领导力传达给团队、Scrum Master作为仆人式领导者的角色展开叙述,同时重点阐述仆人式领导者应有的基本内外特征。
在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中对于锁的性能优化,以及锁的存储结构及升级过程。
本次分享将首先介绍现代富文本编辑器的组成和实现,然后结合UEditor的开发过程,与参会者分享UEditor在设计和实现的过程中,所涉及到的核心功能的细节实现。
本次演讲视频录制于百度技术沙龙。
我们所开发的应用程序大多都需要提供一个图形用户界面(GUI)。关于GUI应用的架构设计,已经有了Form & Control、MVC,、MVP、 Passive View等多种模式。模式可以帮助我们建立优雅的架构,但前提是弄清楚模式的应用场景。弄清楚GUI应用面临的设计上的问题,有助于我们正确的挑选设计方案。
MongoDB是一种非常易用的NoSQL方案,Brian C. Dilley在这篇文章里介绍了MongoDB的优劣势,并介绍了MJORM项目。MJORM用于MongoDB,是一个没有注解的Java ORM库。
随着网络基础设施的逐步成熟,从RPC进化到Web Service,并在业界开始普遍推行SOA,再到后来的RESTful平台以及云计算中的PaaS与SaaS概念的推广,分布式架构在企业应用中开始呈现出不同的风貌,然而殊途同归,这些分布式架构的目标仍然是希望回到建造巴别塔的时代,系统之间的交流不再为不同语言与平台的隔阂而产生障碍。
4 条回复
关注此讨论 回复