RequireJs 提供了一个打包工具 r.js,可以将相关的模块打包为一个文件。相关说明:http://www.requirejs.org/docs/optimization.html

  • 将相关的脚本模块整合为单个脚本文件,然后默认使用  UglifyJS 进行紧缩,或者在使用 java 的时候,使用  Closure Compiler 处理。
  • 还可以通过 @import 自动内联相应的样式,并且删除注释来优化 CSS

虽然可以通过命令行来使用这个打包工具,但是在 Grunt 中也提供了相应的插件来自动完成这个任务。

1. 安装

地址:https://github.com/gruntjs/grunt-contrib-requirejs

 npm install grunt-contrib-requirejs --save-dev

控制台输出

grunt-contrib-requirejs@0.4.4 node_modules\grunt-contrib-requirejs
└── requirejs@2.1.20

在 Gruntfile.js 文件中,使用 grunt.loadNpmTasks 来加载这个任务。

grunt.loadNpmTasks('grunt-contrib-requirejs');

2. 配置

module.exports = function(grunt) {

  // Project configuration.
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'), copy: {
dev: {
files: [
{expand: true, src: ['src/**/*.js'], dest: 'public/js', filter: 'isFile'}
]
}
}, requirejs: {
compile: {
options: {
name: "main",
baseUrl: "src/js",
mainConfigFile: "main.js",
out: "public/js/main.js"
}
}
} }); // 加载包含 "copy" 任务的插件。
grunt.loadNpmTasks('grunt-contrib-copy'); grunt.loadNpmTasks('grunt-contrib-requirejs'); // 默认被执行的任务列表。
grunt.registerTask('default', ['uglify']); };

compile 是我们为任务所起名称,options 中是相应的配置。

  • baseUrl, 类似于 requirejs 中的 baseUrl 参数,用来定义脚本的参照地址。
  • mainConfigFile: requirejs 的配置文件,工具通过它来获取 requirejs 的配置信息。它的地址要相对于 baseUrl 地址。
  • name, 入口模块的地址,也就是我们的入口模块,这里是模块名称,所以不需要 .js 的扩展名,地址也要相对于 baseUrl 地址。如果你使用了 almond 进行压缩,almond相当于入口模块了,这里就是 almond 的地址。也不需要 .js 扩展名。
  • out, 输出的结果,这个地址与 baseUrl 没有关系,是相对于 Gruntfile.js 的地址
  • include 需要包含的模块名称,如果使用了 almond,入口已经变成 almond 了,就必须要包含原始的入口模块名称。

2.1 直接使用 r.js

在使用这个紧缩任务的时候,默认是不包含 require.js 库的,所以有两种用法。

第一种用法,只紧缩我们定义的模块,这样紧缩出来的结果中,会包含 require 过的第三方库,比如 jquery, angularjs 等等,但是不会包含 requirejs 本身。所以,我们需要在页面中先引用 require.js 库,然后引用我们紧缩的结果。

requirejs: {
compile: {
options: {
name: "main",
baseUrl: "src/js",
mainConfigFile: "main.js",
out: "public/js/main.js"
}
}
}

第二种用法,直接将 require.js 也包含进来,这样,只需要在页面中引用紧缩的结果即可。

先通过 paths 给 require.js 起一个名称,然后在 include 中包含这个模块。

    //Set paths for modules. If relative paths, set relative to baseUrl above.
//If a special value of "empty:" is used for the path value, then that
//acts like mapping the path to an empty file. It allows the optimizer to
//resolve the dependency to path, but then does not include it in the output.
//Useful to map module names that are to resources on a CDN or other
//http: URL when running in the browser and during an optimization that
//file should be skipped because it has no dependencies.
paths: {
"requireLib": "lib/require"
}, include: ["requireLib"],

2.2 使用 almond

在使用 almond 的时候,其实更加简单了。

我们将 name 设置为 almond 的路径,然后使用 include 将我们实际的入口模块包含进来就可以了。

这里需要注意一点,almond 是一个独立的脚本库,你需要自己将这个库下载来下,直接使用 bower 就可以。然后,设置 name 为相对于 baseUrl 的 almond 库路径即可。

requirejs: {
compile: {
options: {
baseUrl: "tmp",
mainConfigFile: "tmp/main.js",
include: "main",
name: "../bower_components/almond/almond",
out: "tmp/<%= pkg.name %>.js"
}
}
}

注意,上面的官方实例中没有使用 include 包含实际的入口。结果就是不会执行的你的脚本。

关于 almond 的限制

  • 将所有的模块合并到单个文件,不会再有动态加载。
  • 所有的模块都拥有唯一的标识,以及通过 define() 来说明的模块所依赖的模块说明数组,requirejs 优化器通过它来检查模块关系。
  • 只能使用一次 requirejs.config() 调用
  • requirejs.config 需要包含在输出中,这对于 map config 很重要
  • 不支持 var require = {} 来传递配置参数
  • 不支持  RequireJS multiversion support/contexts.
  • 不要使用 require.toRul() 或者 require.nameToUrl()
  • 不要使用 packages/packagePaths config.

仍然支持的特性:

  • 使用相对路径的依赖
  • define('id', {}) 定义
  • define(), require() 和 requirejs() 调用
  • 将插件合并到优化之后的文件中,在优化之后可以同步访问这些资源。

参考资料

requirejs:杏仁的优化(almond)

Grunt 之 RequireJS的更多相关文章

  1. 使用grunt完成requirejs的合并压缩和js文件的版本控制

    最近有一个项目使用了 requirejs 来解决前端的模块化,但是随着页面和模块的越来越多,我发现我快要hold不住这些可爱的js文件了,具体表现在每个页面都要设置一堆 requirejs 的配置( ...

  2. grunt与requirejs结合使用

    // 多个js压缩成一个js // Project configuration. module.exports = function(grunt) { // 使用严格模式 'use strict'; ...

  3. 前端打包构建工具grunt快速入门(大篇幅完整版)

    打包的目的和意义就不用叙述了直接上干货 http://www.gruntjs.net/getting-started里面的教程也太简单了,需要下一番功夫去研究才行.本文将grunt打包的常用方法都用实 ...

  4. 【grunt整合版】30分钟学会使用grunt打包前端代码

    grunt 是一套前端自动化工具,一个基于nodeJs的命令行工具,一般用于:① 压缩文件② 合并文件③ 简单语法检查 对于其他用法,我还不太清楚,我们这里简单介绍下grunt的压缩.合并文件,初学, ...

  5. 【grunt第二弹】30分钟学会使用grunt打包前端代码(02)

    前言 上一篇博客,我们简单的介绍了grunt的使用,一些基础点没能覆盖,我们今天有必要看看一些基础知识 [grunt第一弹]30分钟学会使用grunt打包前端代码 配置任务/grunt.initCon ...

  6. 浅谈HTML5单页面架构(二)——backbone + requirejs + zepto + underscore

    本文转载自:http://www.cnblogs.com/kenkofox/p/4648472.html 上一篇<浅谈HTML5单页面架构(一)--requirejs + angular + a ...

  7. 使用grunt打包前端代码

    grunt 是一套前端自动化工具,一个基于nodeJs的命令行工具,一般用于:① 压缩文件② 合并文件③ 简单语法检查 对于其他用法,我还不太清楚,我们这里简单介绍下grunt的压缩.合并文件,初学, ...

  8. Grunt 插件使用汇总

    最近使用了很多 Grunt 插件,这里把使用 Grunt 中涉及的从开发.代码检查.单元测试.E2E 测试,直到发布所涉及的插件,做一个比较完全的汇总. 环境搭建 1. 创建 Web 前端开发环境 2 ...

  9. H5单页面架构:backbone + requirejs + zepto + underscore

    首先,来看看整个项目结构. 跟上一篇angular类似,libs里多了underscore和zepto.三个根目录文件: index.html:唯一的html main.js:requirejs的配置 ...

随机推荐

  1. Javascript跨域问题解决方案

    ---本方法来自网上,因最近项目需求,解决了三天未果,最终发现此文并测试可用. 一个 非常优雅绝妙的解决方案!话不多说,直接上解决方案原理图: 该图要解决的问题说明如下:在AAA.com域名下的ind ...

  2. 剑指offer系列43---判断平衡二叉树

    [题目]判断一颗二叉树是不是平衡二叉树. * 平衡二叉树定义:任意子节点深度相差不超过1.[思路]由上题,利用递归得到二叉树每个结点的深度同时比较. package com.exe9.offer; i ...

  3. IE浏览器的兼容模式代码细节解读

    兼容性对于网页设计师来说非常重要.虽然最好是建立一个完全不需依赖任何网页浏览器特性或功能的网站,但是有时候这是不可能实现的.而文件兼容模式能将网页限制在某个特定版本的IE中.可以使用 X-UA-Com ...

  4. mousewheel滚轮事件 浏览器的写法

    鼠标的滚轮事件,在Jquery中有对应的一个插件:https://github.com/brandonaaron/jquery-mousewheel 原生的滚轮事件:火狐与其他浏览器使用了不同的事件 ...

  5. C#程序集编译输出XML文档的作用

    下图是ClassLib1类库的项目属性 /// <summary> /// 读取INI文件 /// </summary> /// <param name="Se ...

  6. 黄聪:WordPress 多站点建站教程(六):使用WP_Query、switch_to_blog函数实现获取子站点分类中的文章

    首先在你使用主题的funtions.php里面添加下代码: //根据时间显示最新的分类文章内容,每个站点显示一篇内容 //$blog_id 子站点ID //$catid 分类ID wp_reset_q ...

  7. ZooKeeper典型应用场景(转)

    ZooKeeper是一个高可用的分布式数据管理与系统协调框架.基于对Paxos算法的实现,使该框架保证了分布式环境中数据的强一致性,也正是基于这样的特性,使得ZooKeeper解决很多分布式问题.网上 ...

  8. hibernate.cfg.xml讲解

    <session-factory> <!-- 配置数据库连接信息 --> <!-- 数据库驱动 --> <property name="connec ...

  9. C++ 类的动态组件化技术

    序言: N年前,我们曾在软件开发上出现了这样的困惑,用VC开发COM组件过于复杂,用VB开发COM组件发现效率低,而且不能实现面向对象的很多特性,例如,继承,多态等.更况且如何快速封装利用历史遗留的大 ...

  10. ADF_ADF Faces系列3_ADF数据可视化组件简介之建立Master-Detail

    2013-05-01 Created By BaoXinjian