现在,Require.js是我最喜欢的Javascript编程方式。它可以使代码化整为零,并易于管理。而Require.js Optimizer能帮助我们将一个较大的应用分散成多个较小的应用,并通过依赖串联起来,最后在编译打包时合并起来。这些原因促使我们使用require.js。
那么,让我们来看看require.js有什么牛逼的特性吧!
与CommonJS兼容
AMD (异步模块定义规范) 出现自CommonJS工作组。CommonJS旨在创造Javascript的生态系统。 CommonJS的一个重要部分是transport/c, 即AMD的前身,而require.js则是该规范的一个实现。
CommonJS模块和AMD模块的语法差异,主要由于AMD需要支持浏览器的异步特性。而CommonJS模块则需要同步进行,例如:
var someModule = require( "someModule" ); var anotherModule = require( "anotherModule" ); exports.asplode = function() { someModule.doTehAwesome(); anotherModule.doMoarAwesome(); };
define( [ "someModule"], function( someModule ) { return { asplode: function() { someModule.doTehAwesome(); // 这将会异步执行 require( [ "anotherModule" ], function( anotherModule ) { anotherModule.doMoarAwesome(); }); } }; });
define(function( require, exports, module ) var someModule = require( "someModule" ); var anotherModule = require( "anotherModule" ); someModule.doTehAwesome(); anotherModule.doMoarAwesome(); exports.asplode = function() { someModule.doTehAwesome(); anotherModule.doMoarAwesome(); }; });
实际上,require.js通过函数.toString解释回调函数的模块内容,找到其正确的依赖,将其变成一个通常的AMD模块。需要注意,如果你使用这种方式编写模块,可能会发生与其他AMD加载器不兼容的情况,因为这违背了AMD规范,但它能很好的理解这种格式的写法。
这里发生了什么,require.js实际上做了function.toString的回调函数解析模块的内容,找到正确的依赖,就像它,如果它是一个正常的AMD模块。重要的是要注意,如果您选择这样写模块,他们将最有可能不兼容与其他AMD模块装载机,因为这违背了AMD规范,但它是很好的了解这个格式存在!
CDN回退
另一个隐藏的require.js瑰宝是,其支持当CDN加载不正确时,回退加载本地相应的库。我们可以通过require.config达到这个目的:
requirejs.config({ paths: { jquery: [ '//cdnjs.cloudflare.com/ajax/libs/jquery/2.0.0/jquery.min.js', 'lib/jquery' ] } });
没有依赖?对象字面量?没问题!
当你写一个没有任何依赖的模块,并且只是返回一个对象包含一些功能函数,那么我们可以使用一种简单的语法:
define({ forceChoke: function() { }, forceLighting: function() { }, forceRun: function() { } });
循环依赖
在一些情况中,我们可能需要模块moduleA和moduleA中的函数需要依赖一些应用。这就是循环依赖。
// js/app/moduleA.js define( [ "require", "app/app"], function( require, app ) { return { foo: function( title ) { var app = require( "app/app" ); return app.something(); } } } );
如果你需要得到模块的地址,你可以这么做……
var path = require.toUrl("./style.css");
BaseUrl
通常,在进行的单元测试时,你的源代码可能放在类似src的文件夹里,同时,可能你的测试放在类似tests的文件夹里。这可能比较难让测试配置正确。
比如我们在tests文件夹有一个index.html文件,并需要本地加载tests/spec/*.js。并假设,所有源代码在为src/js/*.js,并有一个main.js在该文件夹。
index.html中,不在加载require.js时设置data-main。
<script src="src/js/vendor/require.js"></script> <script> require( [ "../src/js/main.js" ], function() { require.config({ baseUrl: "../src/js/" }); require([ "./spec/test.spec.js", "./spec/moar.spec.js" ], function() { // start your test framework }); }); </script>
在这里,你可以看到main.js被载入。然而,由于它没有加载数据主要脚本标记,那么您必须指定一个base即可。当数据主要是用于baseURL时从主文件中的位置推断。通过自定义baseUrl我们可以很容易将测试代码和应用代码分开存放。
JSONP
我们可以这样处理JSONP终端:
require( [ "http://someapi.com/foo?callback=define" ], function (data) { console.log(data); });
在很多请款下,我们需要使用非AMD库。例如Backbone和Underscore并未适应AMD规范。而jQuery实际上只是将自己定义成一个名为jQuery全局变量,所以对于jQuery什么都不用做。
幸运的是,我们可以使用shim配置来解决这一问题。
require.config({ paths: { "backbone": "vendor/backbone", "underscore": "vendor/underscore" }, shim: { "backbone": { deps: [ "underscore" ], exports: "Backbone" }, "underscore": { exports: "_" } } });
本文向大家介绍require.js的用法详解,包括了require.js的用法详解的使用技巧和注意事项,需要的朋友参考一下 一、为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了。后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载。下面的网页代码,相信很多人都见过。 这段代码依次加载多个js文件。 这样的写法有很大的缺
前面花了四章的时间完成了项目(wechat)的开发,并且也放到了线上。这篇来说说模块化的事情。 15.1 模块化的概念 对于通常的网站来说,一般我们不会把所有的js都写到一个文件中,因为当一个文件中的代码行数太多的话会导致维护性变差,因此我们常常会根据业务(页面)来组织js文件,比如全站都用到的功能,我就写一个base.js,只是在首页会用到的功能,就写一个index.js。这样的话我更改首页的逻
为了试图深入理解Java流和spliterator,我有一些关于spliterator特性的微妙问题: Q1:与(不带参数的stream.of()) :已沉降,大小 :沉降的、不可变的、有大小的、有序的 为什么不具有相同的特性?请注意,当它与stream.concat()结合使用时(特别是没有)会产生影响。我想说不仅应该具有不可变和有序性,而且还应该具有DISTINCT和nonnull。只有一个参
本文向大家介绍Require.js的基本用法详解,包括了Require.js的基本用法详解的使用技巧和注意事项,需要的朋友参考一下 一:什么是require.js ①:require.js是一个js脚本加载器,它遵循AMD(Asynchronous Module Definition)规范,实现js脚本的异步加载,不阻塞页面的渲染和其后的脚本的执行,并提供了在加载完成之后的执行相应回调函数的功能;
本文向大家介绍require.js中的define函数详解,包括了require.js中的define函数详解的使用技巧和注意事项,需要的朋友参考一下 前言 模块不同于传统的脚本文件,它良好地定义了一个作用域来避免全局名称空间污染。它可以显式地列出其依赖关系,并以函数(定义此模块的那个函数)参数的形式将这些依赖进行注入,而无需引用全局变量。RequireJS的模块是模块模式的一个扩展,其好处是无需
问题内容: 为了尝试深入了解Java流和分隔符,我对 分隔符的特性 提出了一些微妙的问题: Q1:vs(不带参数的Stream.of()) :已 订阅 :已 预订, 不可 更改,已 预订 ,已 订购 为什么没有相同的特征?请注意,与Stream.concat()结合使用时会产生影响(特别是没有)。我要说的不仅应该是 IMMUTABLE和ORDERED ,还应该是 DISTINCT和NONNULL