19

require.js以最佳方式说明在模块内定义对象的define([requiremens], object)方式。

因此,每个页面或其他 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 以相同的方式定义,并返回对象。

但是当我用请求编辑文件时,我无法通过代码导航,所以如果我想编辑 Message 对象,唯一的方法是自己打开文件并找到我需要的功能,而不是让 IDE 跳转到那里为了我。

是否有一些专门针对 pycharm 的解决方法或共同的 require.js 来解决此问题?当您有大量代码时,导航它会变得一团糟,这就是我首先使用 IDE 的原因!

更糟糕的是:编辑器永远不知道对象有什么功能!

我可以看到的一种可能的解决方案是不使用封闭的命名空间,并在调用之前声明全局变量define(),但在这种情况下,所有对象都应像 UI_Message、AJAX_Requests 一样调用。为了确定,我在两个不同的位置没有一些消息....

而且我不确定 require.js 优化器是否会正确使用它。Require.js 文档说明的很清楚,要远离全局变量。

4

2 回答 2

8

这是一个已知问题,请加注星标/投票。

从问题描述:

dojo 库切换到 AMD 的格式 define() 来加载模块,而不是 dojo.require()。以前我可以在 dojo.require('path.to.someJs') 上使用 Ctrl+B 来跳转到声明。这不适用于新格式 define(['path/to/someJs]', ...)。

由于 PyCharm、WebStorm、PhpStorm 和 IntelliJ IDEA 共享同一个 JavaScript 插件,这个问题也适用于您使用的产品。在修复此错误之前,您将继续观察所描述的问题。带来不便敬请谅解。

于 2011-12-14T16:59:54.753 回答
3

如果您使用CommonJs 包装器定义模块并使用导出和模块参数,WebStorm(至少 6.0.2)支持使用 RequireJs 进行代码导航:

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

显然,即使使用它的模块不使用 CommonJs 包装器格式,它也可以工作:

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

如果其他 IDE 使用与 CrazyCoder 所说的相同的 JavaScript 插件,那么它也可能适用于他们的新版本。

于 2013-07-16T07:24:11.167 回答