angularjs集成requirejs

2015年7月22日 · 155 字 · 1 分钟

angularjs自带的模块话机制对于业务逻辑的组织确实起到了规范化的作用,但是对于大型web项目,弊端也出来了,一次性加载所有的资源会导致进入应用的时间变长,而实际上,首页需要加载的并不多,所以,本文将介绍如何使用requireJs与angularJs集成。

依赖

  • jquery(非必须)
  • angularjs
  • ui-router
  • requirejs

入口文件

我们知道,使用requireJs之后,在首页只需使用script标签加载requirejs即可,剩下的文件加载需要配置下入口文件。

/**
 * @author xialei <[email protected]>
 */
require.config({
    baseUrl: 'app',
    paths: {
        "angular": "/vendor/angular/angular",
        "ui-router": "/vendor/ui-router/release/angular-ui-router",
        "jquery": "/vendor/jquery/dist/jquery"
    },
    shim: {
        "angular": {
            exports: "angular",
            deps: ["jquery"]
        },
        "ui-router": {
            exports: "ui-router",
            deps: ["angular"]
        },
        "jquery": {
            exports: "jquery"
        }
    }
});

require(["jquery", "angular", "app","router","controllers"], function($, angular) {
    $(function() {
        angular.bootstrap(document, ["app"]);
    });
});

vendor是依赖的库,路径可以根据实际情况进行修改。
angularjs的代码组织方式不是amd规范的,所以需要使用shim将其暴露出来供其他模块使用。
由于采用了requireJs,所以不能直接写 angular.module(‘xx’,[])这种代码了。因为依赖的库有可能没下载完成。

app.js

var app = angular.module("app", ["ui.router"]);

使用requireJs之后,这种就行不通了,因为amd开发方式下,一切皆模块。
而app作为“根模块”是需要给其他模块(controller,directive,etc…)使用的,所以模块定义的最后需要return。

var app = angular.module("app", ["ui.router"]);
define(["angular","ui-router"], function(angular) {
    var app = angular.module("app", ["ui.router"]);
    return app;
});

这样,其他需要依赖app模块的模块就可以使用该“根模块了”。

controllers.js

define(["app"], function(app) {
    app.controller("HomeCtrl", ["$scope", function($scope) {
        $scope.run = function() {
            console.log('run');
        };
    }]);
});

controllers是依赖app模块的,所以这里引入app依赖,其他代码与之前一样。

router.js

之前一直使用angular-router,但是永久之后发现还是ui-router好用,这里使用ui-router作为路由管理库。

define(["app"], function(app) {
    app.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {
        $stateProvider.state('index', {
            url:"/",
            views: {
                "main": {
                    templateUrl: "app/templates/home.html",
                    controller: "HomeCtrl"
                }
            }
        });
        $urlRouterProvider.otherwise('/');
    }]);
});

index.html

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>Angularjs+RequireJs</title>
</head>
<body>

<div ui-view="main"></div>
<script src="/vendor/requirejs/require.js" data-main="main"></script>
</body>
</html>

相比于之前写很多script标签,这里只需要写一个,是不是“清爽”了很多呢?

demo

demo,打开之后只有一个"run"的按钮,请大家打开控制台之后点击按钮即可。