如果你只是想找一款称手的js加载器,可以参考这篇js loader benchmarks(http://artzstudio.com/files/Boot/test/benchmarks/script.html),即便这篇文章已经例举得够多的了,还是没有涵盖到很多已经广为使用的库,如果要跟你自己熟悉的库来做对比,可以仿照文中的例子自行对比。

我要说的是require.js,可以作为加载器来使用,但它诞生的目的不是为了异步加载脚本,而是为了模块化,同时也就不会污染global。简单做了一个与angular.js结合的demo。
关于require.js,可以参考阮一峰的《javascript模块块编程》,在此给出介绍require.js的一节http://www.ruanyifeng.com/blog/2012/11/require_js.html
官方api就不用说了:http://requirejs.org/docs/api.html
同时还支持压缩优化:http://requirejs.org/docs/optimization.html

本文练习使用require.js和angular,以及利用r.js来进行压缩

1,结构

--index.html
--js
--main.js(入口)
--app(业务代码,angular相关代码)
----app.js
----controllers.js
----directives.js
----filters.js
----services.js
--test(业务代码,测试用,跟app作用差不多,此处测把不同的程序加载同一插件的不同版本)
----plugin.1.0.js
----plugin.1.2.js
----newapp.js
----oldapp.js
--vendor(提供程序,angular,jquery等,如果引用了underscore, backbone当然也应该是这个目录)
----jquery.js
----angular.js
--partials
--partial1.html
--partial2.html
--css
--app.css

当然,大体上,是跟这个seed一样的:https://github.com/tnajdek/angular-requirejs-seed

2,传统写法

<script src="js/vendor/angular.js"></script>
<script src="js/app/app.js"></script>
<script src="js/app/services.js"></script>
<script src="js/app/controllers.js"></script>
<script src="js/app/filters.js"></script>
<script src="js/app/directives.js"></script>

3,require.js的写法

可以这么写:

<script type="text/javascript" data-main="js/main" src="js/vendor/require.js"></script> 

也可以把main.js的内容直接写到紧要require.js引用的地方,第一个被发现的requirejs({}), requirejs.config({}), require({}), 或 require.config({})会被认作配置文件:

<script type="text/javascript" src="js/vendor/require.js"></script>
<script type=""text/javascript">
require.config({
//same as main.js
});
require(['main']);
</script>

4,引入require后angular的写法:

//观察一下define的用法就基本明白了

//声明依赖于service, filter, directive的app级别的moudle
define(['lib/angular'],function(angular){
angular.module('myApp', ['filters', 'services', 'directives', 'controllers']).
config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/view1', {templateUrl: 'partials/partial1.html', controller: 'MyCtrl1'});
$routeProvider.when('/view2', {templateUrl: 'partials/partial2.html', controller: 'MyCtrl2'});
$routeProvider.otherwise({redirectTo: '/view1'});
}]);
}); //srvices.js define(['lib/angular'],function(angular){
// Demonstrate how to register services
// In this case it is a simple value service.
angular.module('services', []).
value('version', '0.1');
// factory('version',function(){return '0.3';});
}); //filters.js define(['lib/angular'],function(angular){
angular.module('directives', []).
directive('appVersion', ['version', function(version) {
return function(scope, elm, attrs) {
elm.text(version);
};
}]);
}); //controllers.js define(['lib/angular'],function(angular){
angular.module('controllers', []).
controller('MyCtrl1', [function() { }])
.controller('MyCtrl2', [function() { }]);
});

5,制作main.js文件

require.config({
baseUrl:'js/app',//配置默认路径,
paths:{
'lib':'../vendor',//配置了baseUrl后,显然不处于其子目录的路径是需要额外配置的
'test':'../test',
'main':'../main'
},
shim:{
'lib/angular':{exports:'angular'}//不支持AMD的脚本用shim的方式加载
},
map:{
//一个项目里用了同一插件不同版本的情况用map来映射
'*':{'plugin':'test/plugin.1.2'},
'test/oldapp':{'plugin':'test/plugin.1.0'}
}
}); require([
'lib/angular',
'test/newapp',
'test/oldapp',
'app',
'services',
'controllers',
'filters',
'directives'
],function(angular){
//此处引用了所需的所有模块,并且只做了一件事,用angular把页面驱动起来。
angular.bootstrap(document,['myApp']);
});

写的过程中边看文档边做了很多尝试,总之成品就是上面那样的了,建议还是多读读文档,讲解了很多需要注意的地方。

6,合并/压缩js文件

同样,细读文档,你的电脑需要有node环境,同时下载了r.js,测试过程略过,看我测试通过的成品吧:

//build.js,置于js根目录下
({
baseUrl:'app',
paths:{requireLib:'../vendor/require'},
include:'requireLib',//如果需要把require也压进去(这样整个项目只需要一个js文件了),设置其path,并
name:'main',
out:'main-built-require.js',//输出的文件名
optimize:'none',//注释掉此行即可同时把合并后的js文件压缩
mainConfigFile:'main.js'//用已写好的main.js文件来处理模块依赖关系
})

运行命令(因为r.js在整个项目之外,build.js位于/js/目录下,所以跳两层跳出去:

node ../../r.js -o app.build.js

同级目录顺利生成main-built-require.js

7,压缩整个项目

还没深入研究,以下这个脚本可以把每个js和css进行压缩:

//app.build.js
({
appDir:'../',//以本文件为起点,配置项目根目录
dir:'../../appdirectory-build',//为了不影响源码,输出到同级目录
mainConfigFile:'main.js'//同样,入口配置文件的位置
})

同样的命令:

node ../../r.js -o app.build.js

看输出,很明显地提示了在用Uglifying压缩了每一个js文件,以及css文件(忽视对web-server.js的报错,那是为了用node把网站跑起来写的一个脚本,与本例无关)

F:\temp\require_angular\js>node ../../r.js -o app.build.js
Optimizing (standard.keepLines) CSS file: F:/temp/appdirectory-build/css/app.css Uglifying file: F:/temp/appdirectory-build/js/app/app.js
Uglifying file: F:/temp/appdirectory-build/js/app/controllers.js
Uglifying file: F:/temp/appdirectory-build/js/app/directives.js
Uglifying file: F:/temp/appdirectory-build/js/app/filters.js
Uglifying file: F:/temp/appdirectory-build/js/app/my.js
Uglifying file: F:/temp/appdirectory-build/js/app/services.js
Uglifying file: F:/temp/appdirectory-build/js/app.build.js
Uglifying file: F:/temp/appdirectory-build/js/build.js
Uglifying file: F:/temp/appdirectory-build/js/main-built-require.js
Uglifying file: F:/temp/appdirectory-build/js/main-built-require2.js
Uglifying file: F:/temp/appdirectory-build/js/main-built.js
Uglifying file: F:/temp/appdirectory-build/js/main.js
Uglifying file: F:/temp/appdirectory-build/js/test/newapp.js
Uglifying file: F:/temp/appdirectory-build/js/test/oldapp.js
Uglifying file: F:/temp/appdirectory-build/js/test/plugin.1.0.js
Uglifying file: F:/temp/appdirectory-build/js/test/plugin.1.2.js
Uglifying file: F:/temp/appdirectory-build/js/vendor/angular.js
Uglifying file: F:/temp/appdirectory-build/js/vendor/require.js
toTransport skipping F:/temp/appdirectory-build/web-server.js: Error: Line 1: Un
expected token ILLEGAL
Error: Cannot parse file: F:/temp/appdirectory-build/web-server.js for comments.
Skipping it. Error is:
Error: Line 1: Unexpected token ILLEGAL css/app.css
----------------
css/app.css

8,示例代码下载

zip文件svn地址

require.js初试(with angular & optimization)的更多相关文章

  1. require.js使用教程

    require.js使用教程 下载require.js, 并引入 官网: http://www.requirejs.cn/ github : https://github.com/requirejs/ ...

  2. Angular.JS + Require.JS + angular-async-loader 来实现异步加载 angular 模块

    传统的 angular 应用不支持异步加载模块,必须在 module 启动的时候,所有模块必须预加载进来. 通过使用 angular-async-loader 库,我们可以使用 requirejs 等 ...

  3. ASP.NET MVC应用require.js实践

    这里有更好的阅读体验和及时的更新:http://pchou.info/javascript/asp.net/2013/11/10/527f6ec41d6ad.html Require.js是一个支持j ...

  4. require.js优化器

    项目发布前,require.js优化器可以合并require.js各个模块. 官网: http://requirejs.org/docs/optimization.html 安装 npm instal ...

  5. 使用 Require.js 引用第三方框架时遇到的一些情况

    使用 Require.js 引用第三方框架时遇到的一些情况 在使用Require.js解析依赖的时候,会出现以下几种情况: 程序中的依赖关系 当前程序 依赖于 B包, B包 依赖于 A包 A包与B包两 ...

  6. require.js实践

    ASP.NET MVC应用require.js实践 这里有更好的阅读体验和及时的更新:http://pchou.info/javascript/asp.net/2013/11/10/527f6ec41 ...

  7. js模块化开发——require.js的用法详细介绍(含jsonp)

    RequireJS的目标是鼓励代码的模块化,它使用了不同于传统<script>标签脚本加载步骤.可以用它回事.优化代码,但其主要的目的还是为了代码的模块化.它鼓励在使用脚本以moudle ...

  8. require.js详解

    一:什么是require.js ①:require.js是一个js脚本加载器,它遵循AMD(Asynchronous Module Definition)规范,实现js脚本的异步加载,不阻塞页面的渲染 ...

  9. r.js合并实践 --项目中用到require.js做生产时模块开发 r.js build.js配置详解

    本文所用源代码已上传,需要的朋友自行下载:点我下载 第一步: 全局安装  npm install -g requirejs 第二步: 1.以下例子主要实现功能, 1)引用jq库获取dom中元素文本, ...

随机推荐

  1. 真机调试报错error ==Error Domain=NSURLErrorDomain Code=-1009 "似乎已断开与互联网的连接。"

    真机调试报错error ==Error Domain=NSURLErrorDomain Code=-1009 "似乎已断开与互联网的连接." 请注意,错误代码是-1009,网上关于 ...

  2. docker探索-docker私有仓库搭建(九)

    前言 本文讲解搭建docker的私有仓库,和Mavan的管理一样,Dockers不仅提供了一个中央仓库,同时也允许我们使用registry搭建本地私有仓库 一.环境 ip 主机名 操作系统 角色 19 ...

  3. 【windows】查询占用端口的程序——记一次解决webloigc启动失败的过程

    . . . . . 我们经常使用的网络程序偶尔会遇到端口被占用的情况,但是却苦于无法找到占用端口的程序,这篇文章将教你两个命令,轻松排查端口占用问题. 关键命令: 1.查询端口占用:netstat - ...

  4. swift @AUTOCLOSURE 和 ?? ||

    * {-webkit-tap-highlight-color: rgba(0,0,0,0);}html {-webkit-text-size-adjust: none;}body {font-fami ...

  5. selenium.common.exceptions.WebDriverException: Message: "Can't load the profile.

    记录一下,Selenium在最新版本中修好了这个问题.运行CMD,然后输入 pip install -U selenium

  6. CPP_const&static

    const 1. 定义本地常量,替换宏.#define LENGHTH 16static const int LENGHTH = 16;2. const出现在星号左边,表示被指物是常量:const出现 ...

  7. 输//ip提示找不到应用程序

    输//ip提示找不到应用程序??? (未测试)试试:环境变量的 PATH 中添加 C:\Windows\system32 (未测试)试试:默认程序里----协议关联里:管理ie

  8. 【进阶修炼】——改善C#程序质量(5)

    71, 区分异步和多线程的应用场景. 计算机的很多硬件,如硬盘,光驱,声卡,网卡都有DMA(Direct Memory Access)功能,它可以不占用cpu的资源,而异步的提出恰恰就是基于这个的.而 ...

  9. Hive Tunning 补充 关于bucket

    在前面的几篇文章当中一直有一个概念bucketing不清楚到底是怎么回事. 网友南京-李先森给了他收集的一些资料,如下: Buckets 对指定列计算 hash,根据 hash 值切分数据,目的是为了 ...

  10. ansible wc -l 对结果值取大小的操作

    [root@localhost ansible]# cat zss.yml - hosts: zss tasks: - name: step1 ping: - name: step2 install ...