require學習筆記總結
阿新 • • 發佈:2017-07-06
paths toc sel uil 什麽 回調函數 boa 模塊加載 view
1、加載了 require-jquery.js 文件。註意,官方提供了 require.js和 jquery 的打包版本,推薦。
2、在加載之後,加載入口文件 js/main.js ,註意,main.js 寫進去的時候,不需要後綴名。
你的所有其他 js 模塊文件,都可以寫在 main.js 裏面,通過 main.js 加載。
在data-main指定的主文件中,通過require.config來配置,並加載其他js模塊
[javascript] view plaincopy
具體來說,就是模塊必須采用特定的define()函數來定義。如果一個模塊不依賴其他模塊,那麽可以直接定義在define()函數之中。
假定現在有一個math.js文件,它定義了一個math模塊。那麽,math.js就要這樣寫: [javascript] view plaincopy
[javascript] view plaincopy
[javascript] view plaincopy
[javascript] view plaincopy
[javascript] view plaincopy
2、define 定義模塊方法只能用在獨立的js文件中,不能在頁面中直接使用。
否則會報 Mismatched anonymous define() module 錯誤。
當你寫一個沒有任何依賴的模塊,並且只是返回一個對象包含一些功能函數,那麽我們可以使用一種簡單的語法:
[javascript] view plaincopy
3、循環依賴 在一些情況中,我們可能需要模塊moduleA和moduleA中的函數需要依賴一些應用。這就是循環依賴。
[javascript] view plaincopy
[javascript] view plaincopy
我們可以這樣處理JSONP終端:
[javascript] view plaincopy
[javascript] view plaincopy
1、為什麽使用require.js
作為命名空間; 作為命名空間使用; 異步加載js,避免阻塞,提高性能; js通過require加載,不必寫很多script2、require.js的加載
require.js下載 下載後,放在指定目錄就可以加載了 [javascript] view plaincopy- <script src="js/require.js"></script>
- <script src="js/require.js" defer async="true" ></script>
這種寫法雖然簡單,但其實並不推薦,一般的寫法還要再加個屬性:
[javascript] view plaincopy- <script data-main="js/main" src="js/require-jquery.js"></script>
1、加載了 require-jquery.js 文件。註意,官方提供了 require.js和 jquery 的打包版本,推薦。
2、在加載之後,加載入口文件 js/main.js ,註意,main.js 寫進去的時候,不需要後綴名。
你的所有其他 js 模塊文件,都可以寫在 main.js 裏面,通過 main.js 加載。
3、require.js的配置
- require.config({
- baseUrl: ‘js/‘,
- paths: {
- "backbone": "backbone",
- "underscore": "underscore"
- },
- shim: {
- "backbone": {
- deps: [ "underscore" ],
- exports: "Backbone"
- },
- "underscore": {
- exports: "_"
- }
- }
- });
- exports值(輸出的變量名),表明這個模塊外部調用時的名稱;
- deps數組,表明該模塊的依賴性。
- 主模塊可以將項目基礎模塊加載加來並定義全局方法等
-
[javascript] view plaincopy
- require([‘jquery‘, ‘underscore‘, ‘backbone‘], function ($, _, Backbone){
- // some code here
- });
4、定義模塊(符合AMD規範)
require.js加載的模塊,采用AMD規範。也就是說,模塊必須按照AMD的規定來寫。具體來說,就是模塊必須采用特定的define()函數來定義。如果一個模塊不依賴其他模塊,那麽可以直接定義在define()函數之中。
假定現在有一個math.js文件,它定義了一個math模塊。那麽,math.js就要這樣寫: [javascript] view plaincopy
- // math.js
- define(function (){
- var add = function (x,y){
- return x+y;
- };
- return {
- add: add
- };
- });
- // main.js
- require([‘math‘], function (math){
- alert(math.add(1,1));
- });
[javascript] view plaincopy
- define([‘myLib‘], function(myLib){
- function foo(){
- myLib.doSomething();
- }
- return {
- foo : foo
- };
- });
定義的模塊返回函數個數問題
1、define 的return只有一個函數,require的回調函數可以直接用別名代替該函數名。
2、define 的return當有多個函數,require的回調函數必須用別名調用所有的函數。
[javascript] view plaincopy- require([‘selector‘,‘book‘], function(query,book) {
- var els = query(‘.wrapper‘);
- book.fun1();
- book.fun2();
- });
5、加載js文件
到此為止,我們遇到了兩個關鍵詞,一個是 define ,可以用來定義模塊(命名空間),第一部分我們講了;還有一個是 require,可以直接加載其他 js。它除了簡單的用法: [javascript] view plaincopy- <script>
- require( ["some" ] );
- </script>
[javascript] view plaincopy
- <script>
- require(["aModule", "bModule"], function() {
- myFunctionA(); // 使用 aModule.js 中的函數 myFunctionA
- myFunctionB(); // 使用 bModule.js 中的函數 myFunctionB
- });
- </script>
6、requ.js插件
require.js還提供一系列插件,實現一些特定的功能。
domready插件,可以讓回調函數在頁面DOM結構加載完成後再運行。
[javascript] view plaincopy- require([‘domready!‘], function (doc){
- // called once the DOM is ready
- });
[javascript] view plaincopy
- define([
- ‘text!review.txt‘,
- ‘image!cat.jpg‘
- ],
- function(review,cat){
- console.log(review);
- document.body.appendChild(cat);
- }
- );
7、其他問題
1、路徑與後綴名 在 require 一個 js 文件的時候,一般不需要加上後綴名。如果加上後綴名,會按照絕對路徑加載。沒有後綴名,是按照下面的路徑加載:[javascript] view plaincopy
- <script data-main="js/main" src="js/require-jquery.js"></script>
2、define 定義模塊方法只能用在獨立的js文件中,不能在頁面中直接使用。
否則會報 Mismatched anonymous define() module 錯誤。
3、在代碼中require一個文件多次,不會導致瀏覽器反復加載
不會,這是 RequrieJS 的優點,即使你反復 require 它,它只加載一次。
8、require深入
1、cdn回退 其支持當CDN加載不正確時,回退加載本地相應的庫。我們可以通過require.config達到這個目的: [javascript] view plaincopy- requirejs.config({
- paths: {
- jquery: [
- ‘//cdnjs.cloudflare.com/ajax/libs/jquery/2.0.0/jquery.min.js‘,
- ‘lib/jquery‘
- ]
- }
- });
當你寫一個沒有任何依賴的模塊,並且只是返回一個對象包含一些功能函數,那麽我們可以使用一種簡單的語法:
[javascript] view plaincopy
- define({
- forceChoke: function() {
- },
- forceLighting: function() {
- },
- forceRun: function() {
- }
- });
3、循環依賴 在一些情況中,我們可能需要模塊moduleA和moduleA中的函數需要依賴一些應用。這就是循環依賴。
[javascript] view plaincopy
- // js/app/moduleA.js
- define( [ "require", "app/app"],
- function( require, app ) {
- return {
- foo: function( title ) {
- var app = require( "app/app" );
- return app.something();
- }
- }
- }
- );
[javascript] view plaincopy
- var path = require.toUrl("./style.css");
我們可以這樣處理JSONP終端:
[javascript] view plaincopy
- require( [
- "http://someapi.com/foo?callback=define"
- ], function (data) {
- console.log(data);
- });
9、r.js壓縮
Require.js 提供一個腳本 r.js ,可以將所有使用到的模塊壓縮成一個腳本文件,r.js 可以使用 Node.js 來執行。
在壓縮模塊前,需要寫一個配置文件,說明主模塊名,壓縮後的文件名,哪些模塊不要壓縮
沒有使用 define 定義的模塊都不要壓縮,包括 jQuery,backbone 等庫及其插件
[javascript] view plaincopy- //build.js
- ({
- baseUrl: ‘.‘,
- paths: {
- ‘jquery‘: ‘empty:‘,
- ‘underscore‘: ‘empty:‘,
- ‘backbone‘: ‘empty:‘,
- },
- name: ‘main‘,
- out: ‘main.min.js‘
- })
[javascript] view plaincopy
- node r.js -o build.js
require學習筆記總結