確實如此哦,感覺你已經為自己解答了。
『貳』 如何在node.js中使用requirejs
安裝requirejs
requirejs官方提供了一個可用於node的適配器 r.js
。有兩種方法可以在項目裡面加入此庫。
1. npm
在具體項目目錄下使用如下命令來引入requirejs:
npm install requirejs
windows環境下安裝需要注意不要加上 -g
全局開關,否則不能正常安裝。
安裝完成後,可使用 require('requirejs')
來載入requirejs。
2. 下載r.js
如果不想使用npm,也可以直接下載r.js,並把它放到項目中達到同樣的目的。
點擊下載。
在項目中通過 require('/path/to/r.js')
來載入requirejs。
配置
配置requirejs
var requirejs=require('requirejs');
requirejs.config({
//把node自身的require方法傳遞給requirejs
nodeRequire: require
});
requirejs(["foo","bar"],function(foo,bar){});
在需要使用requirejs的地方可以用上面的代碼來配置requirejs。首先載入requirejs模塊,命名為 requirejs
(可以為其他命名)。然後對 requirejs
進行配置。配置的方法和參數可以參照瀏覽器版本的requirejs的 配置說明
。不過有一點不同,如代碼所示,我們需要把node的 require
方法引進來。最後一行是簡單地載入模塊的示例,requirejs會嘗試把 foo
和 bar
兩個模塊當成AMD模塊來載入,如果失敗,則會調用node的 requie
方法來把它們當作commonjs模塊載入。為了實現這樣的適應性,所以我們需要配置node的 require
方法。但實際測試並不盡如人意,保險起見,還是對AMD模塊使用 requirejs
載入,對commonjs模塊使用 require
載入。
構造AMD格式的node模塊
在node中定義的模塊是commonjs模塊,如果想要構造AMD模塊,我們需要 amdefine
這個包。
安裝amdefine
同樣,可以使用npm進行安裝,在項目目錄下執行:
npm install amdefine
在windows下也存在無法全局安裝的問題,需要對項目單獨安裝。
定義define方法
if(typeof define !== 'function'){
var define=require('amdefine')(mole);
}
amdefine提供了包裝AMD模塊的 define
方法。不過上面代碼中對於node中是否包含define方法的檢測判斷請保留,最好原封不動地將這幾行拷貝到自己的項目中。這樣,我們就可以像使用前端requirejs一樣,定義和使用AMD模塊。
將node自己的common模塊轉換為AMD模塊
原本想通過引用`amdefine`包來實現node端AMD模塊的定義,不過requirejs本身定義了`define`方法,不必額外引入其他包。
『叄』 使用requirejs模塊化引入 js,不知道為什麼還是報錯,就如圖所示
我直接使用esl沒有問題的。。。
require.config({
paths:{
'echarts':'./echarts2/echarts-original',
'echarts/chart/bar':'./echarts2/echarts-original',
'echarts/chart/line':'./echarts2/echarts-original',
'echarts/chart/pie':'./echarts2/echarts-original',
'echarts/theme':'./echarts2/theme'
}
});
require([
'echarts',
'echarts/chart/bar',
'echarts/chart/line',
'echarts/chart/pie'
],function(ec){
EChart._ec=ec;
if(callback){
callback.call(ec,ec);
}
});還有,你那報什麼錯了 ?
『肆』 Mismatched anonymous define() mole:這個怎麼解決requirejs中的
引用的requirejs跟引用的其他js引起了沖突,其他js中也定義的define這個變數.
比如你引用了這樣的js:
<script src="services/require.js"></script>
<script src="services/Utility.js"></script>
出現了Mismatched anonymous define() mole這種錯誤.那麼意味著Utility.js中也定義了define這樣的變數.所以在使用中你只引用require.js
然後 require(['Utility'],function(){}) 使用Utility.js 就不會出現錯誤了.
該錯誤歸根結底就是 define已經被定義了.或者在之後的js中被重寫了.
『伍』 requirejs 怎麼獲取window這個對象
requirejs 是一個根據需要載入javascript模塊的框架。但是有時候在一個項目中,我們可能需要根據不同的平台或者瀏覽器載入不同的模塊,下面我們通過舉一個例子介紹一個簡單的方法解決這些問題。
工具/原料
假如我們現在有以下需要
1、如果瀏覽器原生支持JSON對象,則不載入JSON2模塊,否則,載入JSON2
2、我們現在有2個文件,一個用來操作localStorage,命名為StorageModel.js,一個用來操作cookie,命名為CookieModel.js;假如瀏覽器支持localStorage,則我們載入StorageModel.js而不載入CookieModel.js,否則載入CookieModel.js而不載入StorageModel.js
下面我們來解決這個問題
方法/步驟
1
判斷是否支持
//-------------下面是代碼-----------
var SUPPORT_JSON=(typeof(JSON)!=='undefined');//如果支持則為true,不支持則false
var SUPPORT_STROAGE=(typeof(Storage)!=='undefined')
//----------------------------------
2
requirejs配置
//-------------------------
require.config({
paths:{
/ 當SUPPORT_STORAGE 的值為true時,表達式的值為'/StorageModel';為false時,表達式的值為'/CoookieModel';這樣就達到了根據情況載入其中一個模塊的效果
'model':(SUPPORT_STORAGE && '/StorageModel')||'/CookieModel',/
'json':'/json2'
}
});
//-------------------------
3
載入代碼
//--------------------------------
//下面 (SUPPORT_JSON &&'model')||'json' 當SUPPORT_JSON 的為true時,則表達式的值為'model',而前面已經載入'model'所以會被忽略,當SUPPORT_JSON為false時,則表達式的值為'json',那麼就會載入json2模塊
require('model',(SUPPORT_JSON &&'model')||'json'],
function(){
//......
});
//--------------------------------
『陸』 如何使用requirejs載入html
在前端模塊化的時候,不僅僅是js需要進行模塊化管理,html有時候也需要模塊化管理。這里就介紹下如何通過requirejs,實現html代碼的模塊化開發。
如何使用requirejs載入html
Reuqirejs有一個text的插件,它可以讀取指定文件的內容,讀取到的內容就是文本。
如何下載text插件
第一種方法,可以通過npm下載:
npm install requirejs/text
第二種方法,也可以直接去官方github上面直接下載。
直接拷貝內容到text.js中即可。
如何安裝text插件
在requirejs的main.js中配置text插件的依賴即可,跟jquery差不多,只要保證能通過正常的載入方式載入到它就行。
requirejs.config({
baseUrl: './',
paths: {
'text':path+'/require/text',
...
},
shim: {
...
}
});
也可以直接放在baseUrl裡面。
如何使用text
在目標模塊中,按照下面的語法即可:
define(function(require){
var html = require("text!html/test.html");
console.log(html);
});
或者
define(["text!html/test.html"],function(html){
console.log(html);
});
如何進行html的模塊化開發?
看過上面你已經會使用text了,但是仍然不知道怎麼組織前端代碼。
舉個栗子:
博客園的網站頁面會根據上方的導航跳轉到不同的頁面。如果是在單頁面中,很容易想到原始的做法是,導航的按鈕對應不同的div,點擊那個按鈕,就顯示與之對應的div;其他的div則隱藏掉。
那麼,前端的代碼可能會這樣:
<html>
<body>
<nav>
導航按鈕1、導航按鈕2、導航按鈕3
</nav>
<div style="display:block">按鈕1對應的頁面</div>
<div style="display:none">按鈕2對應的頁面</div>
<div style="display:none">按鈕3對應的頁面</div>
</body>
</html>
這樣的代碼會很雜亂...而且前端Html會很長...不利於維護。
那麼有了reuqirejs的text插件以後,就可以這樣了:
<html>
<body>
<nav>
導航按鈕1、導航按鈕2、導航按鈕3
</nav>
<div id="target"></div>
</body>
</html>
然後在對應的模塊中:
$('#target').html(require("text!目標按鈕對應的頁面.html"));
這樣就隨性多了吧!前端代碼也可以跟著模塊一起有效的管理了!
不過需要注意的是:這種方式會導致Jquery綁定的事件失效——所以一定要在html()方法後面,重新綁定下事件。
『柒』 在這一個普通的js文件里怎麼調用requireJS的define模塊里的函數
RequireJS中定義一個模塊,總的來說有2種方式:簡單鍵值對和回函數依賴式。
1.簡單鍵值對:一個答模塊僅含有值對,沒有任何依賴
define({
color: "black",
size: 1,
method1: function() {},
method2: function() {}
});
這種寫法雖然簡單,但是有很大的局限性,僅僅是定義了該模塊的返回值,不能做一些額外的初始化工作。
通過下面下面這種方式來定義模塊,靈活性更高,我們可以在函數體內寫一些模塊初始化的代碼
define(function () {
//Do initial work here
return {
method1: function() {},
method2: function() {}
};
});
2.函數依賴式:則第一個參數是依賴的名稱數組;第二個參數是回調函數。
在模塊的所有依賴載入完畢後,回調函數會被調用來定義該模塊。
define(["mole1"], function(moudle1) {
function calc()
{
return moudle1.val;
}
return {"get":calc};
}
);
『捌』 使用requirejs時怎麼解決文件版號和增量更新的問題
看你前後端用什麼技術了,我知道的大概有3種情況。 在這三種情況之前,首先要說的是requirejs對依賴增加hash的方式是通過參數urlArgs: 'ver='v{version}在require.config統一增加的,就我所知似乎不能單獨對每個模塊設置 (但可能是我錯了),即每次都得批量更新版本號。
1.如果你採用過requirejs,且前後端分離,前端採用yeoman構建,那麼只要找到相應的質量高的requirejs的generator,無論是gulp還是grunt, 其yeoman的generator應該已經處理好文件緩存增量更新的問題了。 2.假使前後端分離,前端由gulp/grunt集成,文件版本號增量更新,用下面幾個插件就能處理的比較完美: gulp-rev gulp-rev-all gulp-useref (grunt也能找到類似的) 其中gulp-rev,計算文件hash值,gulp-useref對html內特定註解標簽下的內容合並重寫,gulp-rev-all會考慮css引用圖片hash值改變的情況從而更新css文件hash。 等等總之只要去找總能通過gulp/grunt解決這個問題。 3.如果你使用rails(ruby)等前端友好框架,可能會有流行的解決方案,如果不幸用了老舊前端不友好的框架SpringMVC(java),用gulp對jsp重編譯比較蛋疼。。我不知道有沒有相應的插件,如果沒有你只能在後台維持這個版本號變數,對頁面所有靜態資源添加這個後綴,類似下面的代碼:
var require = {
baseUrl: '/Content',
urlArgs: 'ver='+${static_resource_version},
paths: {...},
deps: ['scripts/home/about']
}
<script src="/Content/bower_components/requirejs/require.js?ver=${static_resource_version}" async></script>
其中path之內的所有腳本,以及deps內的入口腳本,都會被追加urlArgs,只是這樣還無法達到最理想增量更新就是了。。。 此外,對於文件版本號的後綴args我也推薦使用git commit的hash值。
『玖』 requirejs入口文件設置的問題
由於 data-main 設置的復制是 js/main , requirejs 按理說應該載入 該 html 所在目錄下的 js 目錄下的 main.js 才對。
而截圖里 卻沒有 js/ 這層目錄。奇怪!
你是在本地啟動的 http 服務,然後綁定 hosts 來調試嗎?
『拾』 reactjs怎麼和requirejs結合使用
1.採用 webpack 的打包方式,來就不需要 require.js 了,文源件依賴關系交給打包工具去處理
2.原文件中不要採用 jsx 的方式, 使用如 React.createElement 這樣的
3.react 相關文件抽取為單獨文件,require 引用打包後的文件