require学习笔记总结

1、为什么使用require.js

作为命名空间;

作为命名空间使用;

异步加载js,避免阻塞,提高性能;

js通过require加载,不必写很多script

2、require.js的加载

require.js下载

下载后,放在指定目录就可以加载了

[javascript] view plaincopy

  1. <script src="js/require.js"></script>

有人可能会想到,加载这个文件,也可能造成网页失去响应。解决办法有两个,一个是把它放在网页底部加载,另一个是写成下面这样:

[javascript] view plaincopy

  1. <script src="js/require.js" defer async="true" ></script>

async属性表明这个文件需要异步加载,避免网页失去响应。IE不支持这个属性,只支持defer,所以把defer也写上。

这种写法虽然简单,但其实并不推荐,一般的写法还要再加个属性:

[javascript] view plaincopy

  1. <script data-main="js/main" src="js/require-jquery.js"></script>

就像一个c程序总有一个 main 方法作为入口一样,上面这种写法,做了几件事情:
1、加载了 require-jquery.js 文件。注意,官方提供了 require.js和 jquery 的打包版本,推荐。
2、在加载之后,加载入口文件 js/main.js ,注意,main.js 写进去的时候,不需要后缀名。
你的所有其他 js 模块文件,都可以写在 main.js 里面,通过 main.js 加载。

3、require.js的配置

在data-main指定的主文件中,通过require.config来配置,并加载其他js模块

[javascript] view plaincopy

  1. require.config({
  2. baseUrl: ‘js/‘,
  3. paths: {
  4. "backbone": "backbone",
  5. "underscore": "underscore"
  6. },
  7. shim: {
  8. "backbone": {
  9. deps: [ "underscore" ],
  10. exports: "Backbone"
  11. },
  12. "underscore": {
  13. exports: "_"
  14. }
  15. }
  16. });

baseUrl:指定基路径

paths:模块加载路径

shim:加载非AMD规范模块

  1. exports值(输出的变量名),表明这个模块外部调用时的名称;
  2. deps数组,表明该模块的依赖性。
  3. 主模块可以将项目基础模块加载加来并定义全局方法等
  4. [javascript] view plaincopy

    1. require([‘jquery‘, ‘underscore‘, ‘backbone‘], function ($, _, Backbone){
    2.     // some code here
    3.   });

4、定义模块(符合AMD规范)

require.js加载的模块,采用AMD规范。也就是说,模块必须按照AMD的规定来写。
具体来说,就是模块必须采用特定的define()函数来定义。如果一个模块不依赖其他模块,那么可以直接定义在define()函数之中。
假定现在有一个math.js文件,它定义了一个math模块。那么,math.js就要这样写:

[javascript] view plaincopy

  1. // math.js
  2.   define(function (){
  3.     var add = function (x,y){
  4.       return x+y;
  5.     };
  6.     return {
  7.       add: add
  8.     };
  9.   });

加载方法如下:

[javascript] view plaincopy

  1. // main.js
  2.   require([‘math‘], function (math){
  3.     alert(math.add(1,1));
  4.   });

如果这个模块还依赖其他模块,那么define()函数的第一个参数,必须是一个数组,指明该模块的依赖性。

[javascript] view plaincopy

  1. define([‘myLib‘], function(myLib){
  2.     function foo(){
  3.       myLib.doSomething();
  4.     }
  5.     return {
  6.       foo : foo
  7.     };
  8.   });

定义的模块返回函数个数问题

1、define 的return只有一个函数,require的回调函数可以直接用别名代替该函数名。

2、define 的return当有多个函数,require的回调函数必须用别名调用所有的函数。

[javascript] view plaincopy

  1. require([‘selector‘,‘book‘], function(query,book) {
  2. var els = query(‘.wrapper‘);
  3. book.fun1();
  4. book.fun2();
  5. });

此处query 函数是1的情况,book 函数是2的情况。

5、加载js文件

到此为止,我们遇到了两个关键词,一个是 define ,可以用来定义模块(命名空间),第一部分我们讲了;还有一个是 require,可以直接加载其他 js。它除了简单的用法:

[javascript] view plaincopy

  1. <script>
  2. require( ["some" ] );
  3. </script>

之外,还有和 define 类似的复杂用法:

[javascript] view plaincopy

  1. <script>
  2. require(["aModule", "bModule"], function() {
  3. myFunctionA(); // 使用 aModule.js 中的函数 myFunctionA
  4. myFunctionB(); // 使用 bModule.js 中的函数 myFunctionB
  5. });
  6. </script>

总结一下,define 是你定义自己的模块的时候使用,可以顺便加载其他js;require 直截了当,供你加载用的,它就是一个加载方法,加载的时候,可以定义别名。

6、requ.js插件

require.js还提供一系列插件,实现一些特定的功能。

domready插件,可以让回调函数在页面DOM结构加载完成后再运行。

[javascript] view plaincopy

  1. require([‘domready!‘], function (doc){
  2.   // called once the DOM is ready
  3. });

text和image插件,则是允许require.js加载文本和图片文件。

[javascript] view plaincopy

  1. define([
  2.     ‘text!review.txt‘,
  3.     ‘image!cat.jpg‘
  4.     ],
  5.     function(review,cat){
  6.       console.log(review);
  7.       document.body.appendChild(cat);
  8.     }
  9.   );

类似的插件还有json和mdown,用于加载json文件和markdown文件。

7、其他问题

1、路径与后缀名

在 require 一个 js 文件的时候,一般不需要加上后缀名。如果加上后缀名,会按照绝对路径加载。没有后缀名,是按照下面的路径加载:

[javascript] view plaincopy

  1. <script data-main="js/main" src="js/require-jquery.js"></script>

也就是默认加载 data-main 指定的目录,即 js/main.js 文件所在的目录。当然,你可以通过配置文件修改。
2、define 定义模块方法只能用在独立的js文件中,不能在页面中直接使用。
否则会报 Mismatched anonymous define() module 错误。

3、在代码中require一个文件多次,不会导致浏览器反复加载

不会,这是 RequrieJS 的优点,即使你反复 require 它,它只加载一次。

8、require深入

1、cdn回退

其支持当CDN加载不正确时,回退加载本地相应的库。我们可以通过require.config达到这个目的:

[javascript] view plaincopy

  1. requirejs.config({
  2. paths: {
  3. jquery: [
  4. ‘//cdnjs.cloudflare.com/ajax/libs/jquery/2.0.0/jquery.min.js‘,
  5. ‘lib/jquery‘
  6. ]
  7. }
  8. });

2、没有依赖?对象字面量?没问题!
当你写一个没有任何依赖的模块,并且只是返回一个对象包含一些功能函数,那么我们可以使用一种简单的语法:

[javascript] view plaincopy

  1. define({
  2. forceChoke: function() {
  3. },
  4. forceLighting: function() {
  5. },
  6. forceRun: function() {
  7. }
  8. });

很简单,也很有用,如果该模块仅仅是功能的集合,或者只是一个数据包。
3、循环依赖

在一些情况中,我们可能需要模块moduleA和moduleA中的函数需要依赖一些应用。这就是循环依赖。

[javascript] view plaincopy

  1. // js/app/moduleA.js
  2. define( [ "require", "app/app"],
  3. function( require, app ) {
  4. return {
  5. foo: function( title ) {
  6. var app = require( "app/app" );
  7. return app.something();
  8. }
  9. }
  10. }
  11. );

4、得到模块的地址

如果你需要得到模块的地址,你可以这么做……

[javascript] view plaincopy

  1. var path = require.toUrl("./style.css");

5、JSONP
我们可以这样处理JSONP终端:

[javascript] view plaincopy

  1. require( [
  2. "http://someapi.com/foo?callback=define"
  3. ], function (data) {
  4. console.log(data);
  5. });

9、r.js压缩

Require.js 提供一个脚本 r.js ,可以将所有使用到的模块压缩成一个脚本文件,r.js 可以使用 Node.js 来执行。

在压缩模块前,需要写一个配置文件,说明主模块名,压缩后的文件名,哪些模块不要压缩

没有使用 define 定义的模块都不要压缩,包括 jQuery,backbone 等库及其插件

[javascript] view plaincopy

  1. //build.js
  2. ({
  3. baseUrl: ‘.‘,
  4. paths: {
  5. ‘jquery‘: ‘empty:‘,
  6. ‘underscore‘: ‘empty:‘,
  7. ‘backbone‘: ‘empty:‘,
  8. },
  9. name: ‘main‘,
  10. out: ‘main.min.js‘
  11. })

压缩命令:

[javascript] view plaincopy

  1. node r.js -o build.js
时间: 2024-10-13 13:39:57

require学习笔记总结的相关文章

require学习笔记(一)

官网文档,看着有点云里雾里,个人写的文档又五花八门,好吧,我只能自己看遍各种文档,自己总结了.去粗取精的理解. 一.概念,模块化的管理 1.以module ID代替URL地址 2.相对于baseUrl的地址来加载所有代码 3.在<script>标签中有一个特殊属性data-main="",requirejs使用data-main来启动js加载过程,baseUrl一般设置到与该项目属性相一致的目录. <script tyoe="text/javascript&

angular学习笔记(三十)-指令(10)-require和controller

本篇介绍指令的最后两个属性,require和controller 当一个指令需要和父元素指令进行通信的时候,它们就会用到这两个属性,什么意思还是要看栗子: html: <outer‐directive> <inner‐directive></inner‐directive> </outer‐directive> 这里有两个指令,一个outer-directive指令元素,它里面又有一个inner-directive指令元素. js: app.directiv

java/android 设计模式学习笔记(一)---单例模式

前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使用的时候也会有一些坑. PS:对技术感兴趣的同鞋加群544645972一起交流 设计模式总目录 java/android 设计模式学习笔记目录 特点 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的使用很广泛,比如:线程池(threadpool).缓存(cache).对

CoAP学习笔记——nodeJS node-coap返回JSON数据包

0 前言 本文说明如何使用node-coap返回JSON数据包.CoAP是专门为物联网系统开发的面向网络的应用层协议栈,CoAP建立在UDP协议之上尽可能减少网络开销,又具有HTTP Restful类型的特性.node-coap使用nodejs实现了coap的客户端和服务器端. [测试环境]--ubuntu/Linux [相关博文] [CoAP协议文档--The Constrained Application Protocol (CoAP)] [CoAP协议学习--CoAP基础] [CoAP学习

node.js在windows下的学习笔记(2)---简单熟悉一些命令

1.打开如下的安装 2.输入node -v,显示node的版本号 3.输入node --help.显示帮助命令 4.自己用一个文本编辑器编写一下代码,保存为text.js,然后在控制台输入node.exe  text.js的路径(直接把这个js文件拖到控制台自动显示路径),按下回车键 var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {&

webpack学习笔记一

webpack.gulp.grunt是前端打包功能工具:因为已经学习了gulp,而最近发现webpack很火,于是着手学习webpack.本篇是webpack学习笔记系列的第一篇,欢迎指教. 我是从慕课网以及官网文档相结合的方式学习的,从官方文档学到的第一个知识点是在使用webpack打包过程中,即使没有webpack.config,js这个文件也是可以的. 首先是全局安装webpack,cmd(如果是window系统,在任意位置)执行命令: npm install --g webpack或cn

Sass学习笔记之入门篇

Sass又名SCSS,是CSS预处理器之一,,它能用来清晰地.结构化地描述文件样式,有着比普通 CSS 更加强大的功能. Sass 能够提供更简洁.更优雅的语法,同时提供多种功能来创建可维护和管理的样式表.以下是我的学习笔记. Sass安装环境 1.安装sass(mac) ①:Ruby安装 ②:安装sass sudo gem install sass 可以通过 sass -v检测是否完成安装   2.更新sass gem update sass 3.卸载(删除)sass gem uninstal

sass个人学习笔记

Materliu 在慕课的视频: http://www.imooc.com/learn/364 . http://www.imooc.com/wiki/371 sass入门:http://www.w3cplus.com/sassguide/ 个人先看了 <Sass与Compass实战>(Materliu 是中文翻译之一)后看的视频,看书的时候不是很了解看了视频之后又看了一遍书终于少许了解sass了 下面是我个人对<Sass与Compass实战>这本书学习笔记总结,有些是个人极端自我

[Pro Angular.JS]学习笔记1.1:设置开发环境

可以使用yeoman.io,很方便.我已经写了一篇随笔,介绍如何使用.这里也有一篇介绍的文章:http://www.cnblogs.com/JoannaQ/p/3756281.html 代码编辑器,在Mac下用了一下WebStorm,太恶心了.另外发现书的作者使用的开发环境是Windows + VS Express 2013,为了方便学习,我也使用VS Express 2013 Update2.VS2013用起来蛮舒服的,把WebStorm比得跟驼屎一样.也许是因为我没用习惯吧. 1.安装Nod