2011-12-14 72 views
19

require.js陳述模塊內部定義對象的方式,define([requiremens], object)是最好的方法。要求js遺址代碼導航

因此,每個頁面或其他js文件都將執行require()調用和接收模塊作爲參數。

這工作得很好,每個功能/模塊都有自己的命名空間。

的問題是,我有:

// AJAX/Requests.js 

define(['UI/Message'],function(Message){ 
var Requests={ 
    checkResponse:function(response){ 
     //1==ok 
     //0==error 
     //2==good message 
     //3==good message, but still stop 
     if(response.status==1){ 
      return true; 
     } 
     else if(response.status==2){ 
      Message.good(response.message); 
      return true; 
     } 
     else if(response.status==3){ 
      Message.good(response.message); 
      return false; 
     } 
     else{ 
      Message.bad(response.message); 
      return false; 
     } 
    } 
}; 
return Requests; 
}); 

現在UI /消息以相同的方式定義,並且將其返回對象。

但是當我用請求編輯文件時,我無法通過代碼進行導航,所以如果我想編輯Message對象,唯一的方法就是去打開自己的文件並找到我需要的函數,而不是IDE在那裏爲我跳。

pycharm是否有一些解決方法,或專爲require.js共同解決此問題?當你有很多代碼時,它會變得亂七八糟,所以我首先使用IDE!

更糟的是:編輯器永遠不知道對象具有哪些函數!

我可以看到的一個可能的解決方案是不使用封閉的名稱空間,並且在define()調用之前聲明全局變量,但是在這種情況下,所有對象都應該調用像UI_Message,AJAX_Requests。爲了可以肯定,我沒有在兩個不同的位置有一些消息....

而我不確定,如果require.js優化器將正確使用此。 Require.js文檔說明非常明確,遠離全局變量。

+0

這修復了嗎? – singsuyash 2017-01-15 16:16:41

回答

8

這是一個known issue,請明星/投票。

從問題描述:

Dojo庫切換到AMD的格式定義()加載模塊 而不是dojo.require()。以前我可以在 dojo.require('path.to.someJs')上使用Ctrl + B跳轉到聲明。 不適用於新格式define(['path/to/someJs]',...)。

由於PyCharm,WebStorm,PhpStorm和IntelliJ IDEA共享相同的JavaScript插件,所以此問題也適用於您正在使用的產品。您將繼續觀察所描述的問題,直到修復此錯誤。抱歉給你帶來不便。

+3

JetBrains已經在這個問題上實現了基礎知識,但是,他們仍然不支持路徑配置(你僅限於相對路徑),你必須點擊定義本身才能訪問模塊。 :( – 2012-06-19 22:25:48

3

WebStorm(至少6.0.2)與支持,如果你定義你的模塊與CommonJs wrapper和使用出口和模塊參數RequireJs代碼導航:

//foo.js 
define(function(require, exports, module) { 
    //use exports to expose properties for code navigation in other modules 
    exports.bar = function() {} 
}); 

顯然,它的工作原理即使如果其他IDE使用

define(['./foo'], function(foo) { 
    foo.bar(); //code navigation works here 
} 

同一個JavaScript插件以CrazyCoder說,它可以在其更新的版本以及工作:使用它的模塊不使用CommonJS的封裝格式。