说明:本文只提供快速入门内容,方便快速进入实战状态。更高级的配置,请参考官网文档。
当初之所以使用 RequireJS 等工具,是因为想提高js的加载速度,避免不必要的堵塞。但通过一段时间的使用,发现 RequireJS 更重要的作用是作为命名空间使用。
一、基本用法
RequireJS 官网文章不是中文的,篇幅不少(官方网址:)。网上的其他相关文章,有的讲的也很复杂。
其实,RequireJS 极其简单。如果你对 c# 或 java 语言的命名空间有一点点了解,那么,RequireJS 的用法和作用,可以用 c# 中的两行代码来类比说明:
1 using xx=wojilu.Core;
2 namespace MyApp {
3 public class MyClass {
4 public void MyTest() {}
5 }
6 }
RequireJS主要的功能,就是实现c#代码的第一行和第二行的功能:1)引入需要使用的命名空间(顺便加个别名也行);2)将自己的代码放到命名空间中,避免全局污染。
因为 javascript 天生的缺点,语言本身没有集成命名空间的概念,所以变量名、函数名很容易发生冲突。这些年,大家想尽了各种办法,给 js 添加命名空间的概念,其中最成熟的套路,就是 RequireJS 这种。
我们可以看到,在c#中只要两行代码的事情,在 js 中,得用多么复杂的类库,比如 RequireJS 去解决。
下面我们看一下 RequireJS 的具体写法,新建一个独立的 wojilu.test1.js 文件,然后输入如下代码:
1 define( ['wojilu.Core'], function(xx) {
2 return {
3 MyTest : function() { alert( 'wojilu1 module' );}
4 };
5 });
和上面的c#代码对比一下,RequireJS 同样也做了两件事情:
1、引入命名空间 wojilu.Core,同时给它取了一个别名 xx;
2、将自己的所有代码放在 define 中,避免全局化的污染冲突。
总之,RequireJS 定义了(define)一个命名空间,在定义的时候,顺便引用了需要使用其他命名空间。我们注意到,按照 RequireJS 的术语,它把命名空间叫做“模块”。注意,在这里,RequireJS 定义的模块(命名空间)是匿名的,没有取名,这是和c#不同的地方。
但这个不要紧,因为其他 js 在用到你这个 js 的时候,一般是根据文件名称加载的,同时可以通过上面的 xx 这种方式,给模块(命名空间)自定义别名,所以,取不取名,还真不是关键。
我们新建另外一个 wojilu.test2.js 文件,来使用 wojilu.test1.js:
1 define( ['wojilu.test1'], function( t1 ) {
2 return {
3 NewTest : function() { t1.MyTest();}
4 };
5 });
同样,也是通过文件名(不需要后缀名),引入了 wojilu.test1 命名空间,并给它取了别名 t1,然后在代码中使用 t1.MyTest() 方法。
按照 RequireJS 的规范,所有的模块定义,都必须放在 return {} 对象中。也就是说,你的代码都要写在 return 返回的 {} 对象里面。这会不会导致代码臃肿难看?当然不会。你可以重构一下,比如这样做:
01 define( ['wojilu.test1'], function( t1 ) {
02
03 function someFunc1() {
04 // 实际主要代码
05 }
06
07 function someFunc2() {
08 // 实际主要代码
09 }
10 // 通过 return 方式,将需要公开的函数暴露出来,供其他 js 调用
11 return {
12 NewTest : function() { t1.MyTest();},
13 fun1 : someFunc1,
14 fun2 : someFunc2
15 };
16 });
当然,要使用 RequireJS 的这些功能,你必须在页面中引用 require.js 文件
1 <script src="require.js"></script>
二、其他用法
上面的用法是标准用法,但 RequireJS 在加载其他 “模块/命名空间/js文件” 的时候,内部是通过传统的 <script src="some.js"></script> 来实现的,所以,你也可以把 RequireJS 仅仅当做 js 加载器使用。比如这行代码:
1 <script src="some.js"></script>
可以写成: