楼主 没有把ng-view用上,因为很多小白们本地server是个什么还不知道那,不用本地server ng-view浏览器是报错的,这个后续文章在介绍,这次主要是把requirejs怎么配置加载angularjs各个模块的
《使用AngularJS开发下一代WEB应用》第三章上面得例子我觉得讲的太笼统,可能楼主 确实是笨了那么一点点点点点..................
首先angular得项目目录:
神马?楼主也用grunt? 你没看错,文章的最后我会稍微介绍下grunt的插件grunt-contrib-requirejs,grunt嘛楼主今天刚学会......所以就先不写出来装X了,网上grunt的文章很多的,但是坑还是有的。
requirjs+angularjs的项目暂时只打包js文件,至于打包模版和css image楼主晚上回家在试试。
介绍 grunt-contrib-requirejs 的文章不多,我会站在一个小白的角度写出来会更好理解(我猜)那么一点点点。
index.html
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<div id="test" ng-controller="myConCon">
login : {{login}}
</div>
</body>
</html>
<!-- './js/main' 为requirejs的配置文件-->
<script type="text/javascript" data-main="./js/main" src="./js/lib/require.js"></script>
main.js
requirejs.config({
//baseUrl 为加载文件的默认路径
//不写默认路径用grunt打包的时候很容易报错找不到文件
//此处的 ./js 是相对于index.html的
baseUrl : './js',
'paths' : {
//有了baseUrl 所以此地方的路径就代表 项目根路径下的js/lib/jquery.js
//同为js文件的话.js可以省略
jquery : 'lib/jquery',
angular : 'lib/angular'
},
shim : {
//此位置只为不支持AMD写法的js文件
angular : {
//表示加载angularjs的依赖,会先加载jquery
deps : ['jquery'],
//全局输出变量其他文件引用angularjs后就引入了此全局变量
//比如下面的 requeirjs([],function(){})方法内
exports : 'angular'
},
jq : {
exports : '$'
}
}
});
//上面为 配置requirjs 是个config,真正加载文件从这requiejs()函数开始
//main.js 内一般都是放的 整个项目的依赖包比如 jquery angular等
//app.js文件 为项目的 根 ng-app(..好难表达 00 !)
requirejs([
//此处会按照 requirejs.config的paths路径和deps依赖关系加载
'angular',
'jquery',
'app'
], function (angular, $, app) {
//jquery方法 dom ready
$(function () {
//通过angularjs的内置方法给 html加上ng-app="myApp"指令
//angularjs 通过ng-app设置作用边界
angular.bootstrap(document,['myApp']);
})
})
app.js
define([
//此处define()加载文件也会按requirejs.config的paths加载
'angular',
//myCon.js 文件不是整个项目的依赖包
//所以在需要的js里加载就可以了无需在requirejs.config配置(AMD按需动态加载)
//此处的加载路径是按 baseUrl配置的路径 ./js/controller/myCon.js
'controller/myCon'
], function (angular) {
//angular.module()通过第二个参数 加载其他文件的 angular.module
var myApp = angular.module('myApp', ['myCon']);
return myApp;
});
mySer
define(['angular'], function (angular) {
angular.module('mySer', [])
.factory('mySerSer', function () {
return {
name : 'world!'
}
});
})
myCon
define([
//加载同app类似了
'angular',
'service/mySer'
], function (angular) {
angular.module('myCon', ['mySer'])
//此处 'mySerSer'只有在上面创建module时 传了参数['mySer'](加载此module)才可用
.controller('myConCon', ['$scope', 'mySerSer', function ($scope, mySerSer) {
$scope.login = mySerSer.name;
}])
//想用别的module的自定义服务 'mySerSer' 需要4步
//1 require([]) 中括号内先加载此文件
//2 angular.module('xxx', ['mySer']) 加载含有mySerSer自定义服务的angular.module
//3 在controller('xx', [])第二个参数(数组)内 传入需要的自定义服务名称 mySerSer
//4 []数组的回调函数内 写入mySerSer的形参,顺序一一对应
})
运行后:
今天下午大体看了下grunt打包的方法
当然开始先搜了下资料,关于grunt-contrib-requirejs gitHub上倒是有api,我觉的还是讲的不够细致,所以稍微注视一下代码:
Gruntfile.js
module.exports = function(grunt){
//grunt的配置我就不叨叨了 自己看官网就ok了
//我就介绍下grunt的依赖插件grunt-contrib-requirejs
//专门打包requeirjs项目的
grunt.initConfig({
//此处的requirejs的配置和requeirjs.config要区分开,那个是requeirjs项目加载配置
//这个是 grunt-contrib-requirejs打包配置
requirejs: {
build: {
options: {
//此处是文件Gruntfile的相对位置
appDir: './app',
//设置默认路径 ./app/js
baseUrl : 'js',
//设置压缩后的路径 ./build
dir: './build',
//这里paths 是被打包文件所需要的依赖文件以及被打包的文件
/*
./app/js/main.js下的代码
requirejs([
'angular',
'jquery',
'app'
], function (angular, $, app) {
......
})
*/
//需要三个angular jquery app
//那么 其他的呢? 其他的模块会按照依赖关系也被打包进去
//比如 app需要 ./app/js/controller/myCon.js grunt就自动把他打包进去了
//我们只管 被打包的文件和此文件requirejs()函数加载的依赖 ....楼主好啰嗦
paths: {
'jquery': 'lib/jquery',
'angular': 'lib/angular',
'app' : 'app',
'main' : 'main',
},
//requiejs.config里面配置了依赖关系和全局变量那为什么这还需要配置
//因为 打包后代码的变量将被替换只有a b c d类似简单的变量了
//那 angularjs自定义模块(比如myCon.js)就报undefined了
//此处配置了,打包后就不报错了,grunt-contrib-requirejs给在中间转了一下
shim: {
angular : {
deps : ['jquery'],
exports : 'angular'
},
jquery : {
exports : '$'
}
},
//此处的modules就是要打包的文件(模块)
//我们例子项目因为通过main.js就把整个项目模块 关联了起来
//main ->angular+jquery+app ->myCon->mySer
//所以我只打包main.js grunt就自动把其他依赖文件按依赖关系(顺序)打包进去
modules: [{
name: 'main'
}]
}
}
},
});
grunt.loadNpmTasks('grunt-contrib-requirejs');
grunt.registerTask('merge', ['requirejs']);
}
看此时浏览器 只加载main.js了把,main.js把所需要的依赖文件都打包进去了
main.js里面的代码
源码地址:click here
当然我的github还很荒凉。。。要加把劲了