requirejs+angularjs+grunt-contrib-requirejs 纯手敲 干货

楼主 没有把ng-view用上,因为很多小白们本地server是个什么还不知道那,不用本地server ng-view浏览器是报错的,这个后续文章在介绍,这次主要是把requirejs怎么配置加载angularjs各个模块的

    《使用AngularJS开发下一代WEB应用》第三章上面得例子我觉得讲的太笼统,可能楼主 确实是笨了那么一点点点点点..................

首先angular得项目目录:

  162703_G7Hc_1460577.jpg

神马?楼主也用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的形参,顺序一一对应
})

运行后:

173608_d7K6_1460577.jpg

今天下午大体看了下grunt打包的方法

当然开始先搜了下资料,关于grunt-contrib-requirejs gitHub上倒是有api,我觉的还是讲的不够细致,所以稍微注视一下代码:

180038_OxJC_1460577.png

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']);
}

180139_vcLm_1460577.jpg 

看此时浏览器 只加载main.js了把,main.js把所需要的依赖文件都打包进去了

main.js里面的代码

180411_YNYo_1460577.jpg

源码地址:click here

当然我的github还很荒凉。。。要加把劲了

转载于:https://my.oschina.net/felumanman/blog/338595

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值