r.js结合gulp等于webpack(angular为例)
本人大学时玩dojo,开始了AMD模块化的不归路,工作后一直使用requirejs,感觉非常好。但是,近来随着react的火热,webpack成为了天下无敌的模块化工具,能做模块化,合并压缩,监视等,当我看见webpack甚至还能做反向代理的时候,我整个人都不好了。我已经打算从requirejs转向webpack了,在重构以前老代码的时候,我想记录下历史。使用r.js结合gulp同样可以实现webpack的绝大部分功能。
例子
源代码地址:https://github.com/lewis617/daily-task
例子比较弯弯绕,不适合angular和requirejs的新手看,但是可以只关注思路。
写的是一个任务管理系统,包括用户系统,任务的crud等功能。
组件(components)
angular的组件指的是指令、过滤器、服务等,在这个例子中,我自己编写了若干个组件,包括一个延迟加载工具、一个等待指令、一个确认框、一个wilddog工具模块(里面包含了若干个我能用到的服务),都是我平时经常复用的组件,直接复制文件夹过去就能用。
还包括一些第三方的组件比如,angular-route,angular-ui等,都是直接用bower安装的。跟我自己写的组件原理是一样的哈哈,只不过最后用了一个module打包起来。
模块(modules)
就是按页面划分的功能模块,包括登录、主页、账户、任务四个模块。每个模块都包括config路由,controller,html页面等。
开始打包
npm install requirejs后可以使用r.js了,我们直接使用r.js命令行工具也可以,但是无法实现监视代码变动的功能,所以我们引入gulp来实现监视功能,其他的合并压缩均使用requirejs来实现。
gulpfile.js
var gulp = require('gulp');
var rjs = require('requirejs');
var paths = {
scripts: ['modules/**/*.js', 'modules/**/**/*.js','main.js']
};
gulp.task('build', function(cb){
rjs.optimize({
baseUrl: "./",
mainConfigFile:"./main.js",
name:'main',
out:'./dist/build-main.js'
}, function(buildResponse){
// console.log('build response', buildResponse);
cb();
}, cb);
});
// Rerun the task when a file changes
gulp.task('watch', function() {
var watcher = gulp.watch(paths.scripts, ['build']);
watcher.on('change', function(event) {
console.log('File ' + event.path + ' was ' + event.type + ', running tasks...');
});
});
gulp.task('default', ['build','watch']);
这个gulp配置文件就写了两个任务,一个是build一个是watch。build任务是直接把requirejs的入口文件(main.js)输入,指定输出目录,再指定配置文件(这里也是main.js),就可以合并压缩了。是不是非常简单。
watch任务就是监视代码变动,如果代码改变就自动合并压缩一次。
那么main.js里面究竟是什么呢?先贴出代码
main.js
'use strict';
require.config({
baseUrl:'',
paths: {
'ngRoute':'bower_components/angular-route/angular-route.min',
'domReady':'bower_components/domReady/domReady',
'text':'bower_components/text/text',
'ui-bootstrap' : 'bower_components/angular-bootstrap/ui-bootstrap-tpls.min',
'angular-animate':'bower_components/angular-animate/angular-animate.min',
'routeConfig':'components/routeConfig'
}
});
require([
'domReady!',
'modules/home/main',
'modules/login/main',
'modules/account/main',
'modules/task/main'
],function(){
angular.module("myApp", [
"myApp.home",
"myApp.login",
"myApp.account",
'myApp.task'
]).run(['$rootScope', 'Auth', function($rootScope, Auth) {
// track status of authentication
Auth.$onAuth(function(user) {
$rootScope.loggedIn = !!user;
});
//alert列表以及关闭方法
$rootScope.alerts = [];
$rootScope.closeAlert = function(index) {
$rootScope.alerts.splice(index, 1);
};
}]);
angular.bootstrap(document,['myApp']);
});
这段代码包含两部分,第一部分是requirejs的配置部分,定义了几个假名而已;第二部分是requirejs的入口部分,主要是先加载一些模块,然后用在主module里面声明以来,最后用run方法,启动一些你需要启动的事件,最后的最后手动启动angular。
多米诺骨牌
本文并不打算写requirejs,但是可以简单说一下,requirejs以及其他所有的模块化工具都是一个多米诺骨牌,触发入口文件,继而引入所有的文件。示例程序中的组件和模块就是这样被引入的。将他们封装起来用文件夹打包,在以后的复用过程中,会非常好用!
比较webpack
这些功能webpack都具备,但是requirejs是可以不全部合并的,有些文件需要延迟加载,比如angular程序绝大多数都是SPA ,如果我们一开始就把所有的文件全部合并,势必会造成首次加载速度非常慢,那么如果我们使用requirejs就可以在改变路由时候延迟加载一些js文件,使得首次加载的js文件体积变小。使用webpack的话,恐怕不能直接实现这个功能,但是一定有相关的插件或者模块可以实现类似的。期待webpack,也感谢历史上那些曾经优秀的工具带给我们的便利,让我们码农的工作更加轻松!
r.js结合gulp等于webpack(angular为例)的更多相关文章
- requirejs原理深究以及r.js和gulp的打包【转】
转自:http://blog.csdn.net/why_fly/article/details/75088378 requirejs原理 requirejs的用法和原理分析:https://githu ...
- gulp + es6 + babel+ angular 搭建环境并实现简单的路由
1.ECMAscript 6的语法糖面临的唯一问题就是浏览器兼容的问题,使得很多程序员望而怯步. 2.babel的作用就是将es6的语法编译成es5被浏览器所识别.这样就可以任性的使用es6了. 3. ...
- gulp+webpack+angular1的一点小经验(第一部分gulp与webpack的整合)
时间匆匆如流水继上周熟悉了gulp的初步安装与环境配置以后,我的项目又进入了新的阶段! 这篇文章将把我这一周遇到的一些问题,以及解决的方式做一个小小的总结,不一定记的完整,但都是个人的一点经验,分享给 ...
- [转]基于gulp和webpack的前端工程化
本文样例代码 :https://github.com/demohi/learning-gulp 本文主要简单介绍一下基于gulp和webpack的前端工程化. 技术栈 React.js reFlux ...
- 前端开发自动化工作流工具,JavaScript自动化构建工具grunt、gulp、webpack介绍
前端开发自动化工作流工具,JavaScript自动化构建工具grunt.gulp.webpack介绍 前端自动化,这样的一个名词听起来非常的有吸引力,向往力.当今时代,前端工程师需要维护的代码变得及为 ...
- Gulp和webpack的区别,是一种工具吗?
疑问:gulp和webpack 什么关系,是一种东西吗?可以只用gulp,不用webpack吗 或者反过来? 它们的区别和概念 ------------------------------------ ...
- JavaScript自动化构建工具入门----grunt、gulp、webpack
蛮荒时代的程序员: 做项目的时候,会有大量的js 大量的css 需要合并压缩,大量时间需要用到合并压缩 在前端开发中会出现很多重复性无意义的劳动 自动化时代的程序员: 希望一切都可以自动完成 ...
- 【简单理解】gulp和webpack的区别
Gulp和Webpack的基本区别: gulp可以进行js,html,css,img的压缩打包,是自动化构建工具,可以将多个js文件或是css压缩成一个文件,并且可以压缩为一行,以此来减少文件体积,加 ...
- gulp与webpack的区别
gulp gulp强调的是前端开发的工作流程,我们可以通过配置一系列的task,定义task处理的事务(例如文件压缩合并.雪碧图.启动server.版本控制等),然后定义执行顺序,来让gulp执行这 ...
随机推荐
- javascript基础知识
1.javascript 表单验证,减轻服务器压力 制作网页特效 动态改变页面内容 基于对象和事件驱动的,具有安全性能的脚本语言 交互,脚本语言.解释性语言,边执行边解释 2.script标签 添加位 ...
- spring3.0使用annotation完全代替XML(三)
很久之前写过两篇博客: spring3.0使用annotation完全代替XML spring3.0使用annotation完全代替XML(续) 用java config来代替XML,当时还遗留下一些 ...
- python列表副本
a=[1,2,3] b=[4,5,6] a=a+b #创建含a和b的副本的新列表 a [1, 2, 3, 4, 5, 6] b [4, 5, 6] c=a+b #创建含a和b的副本的新列表c [1, ...
- iOS 添加中文支持的操作
1.选择工程菜单,这里要选中Project,而不是Targets 2.点击Info菜单, 下拉到最后,看到Localizations. 点击+号. 3.选择中文 chinese-simplif ...
- 可能是最通俗的Lempel-Ziv-Welch (LZW)无损压缩算法详述
最近工作正好接触到这一块,试着自己总结了一下,给需要的人提供一点帮助. 一.概述 首先看看百度百科里的一句话介绍:“LZW就是通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩.” 简单来 ...
- SQLServer中的数据库备份和还原
更多资源:http://denghejun.github.io 备份 SQLServer中的备份,这里是T-SQL的用法,具体示例代码如下,使用也相对简单,其中TestDatabase 是指所需备份的 ...
- xcodebuild命令行打包发布ipa
配置好证书,然后在命令行转到项目目录 1.清除 EthantekiiMac:CTest ethan$ xcodebuild clean 2.编译 EthantekiiMac:CTest ethan$ ...
- [.net 面向对象程序设计进阶] (28) 结束语——告别2015
[.net 面向对象程序设计进阶] (28) 结束语——告别2015 <.net面向对象程序设计进阶>这一系列文章写了太长的时间了,大概有半年没写,在年底又一口气写了好几篇.在整个过程中目 ...
- Azure PowerShell (2) 修改Azure订阅名称
<Windows Azure Platform 系列文章目录> Update: 2016-01-11 笔者文档主要都是用Azure PowerShell 0.x版本来实现的,比如0.98版 ...
- Mint Linux 安装 DotnetCore 遭遇无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系
evlon@evlon-ThinkPad-T530 ~ $ apt install dotnet-dev-1.0.0-preview2-003121 正在读取软件包列表... 完成 正在分析软件包的依 ...