2011-12-14 35 views
19

require.js nêu rõ cách xác định đối tượng bên trong mô-đun với cách define([requiremens], object) là cách tốt nhất.Yêu cầu js ruins chuyển hướng mã

Vì vậy, mỗi trang, hoặc các tệp js khác, sẽ làm require() gọi và nhận mô-đun làm tham số.

Điều này hoạt động khá tốt, mỗi chức năng/mô-đun có không gian tên riêng.

Vấn đề là tôi có:

// 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; 
}); 

Bây giờ UI/tin nhắn được định nghĩa theo cách tương tự, và nó sẽ trả về đối tượng. Nhưng khi tôi chỉnh sửa tập tin với yêu cầu, tôi không thể điều hướng theo mã, vì vậy nếu tôi muốn chỉnh sửa đối tượng Tin nhắn, cách duy nhất là đi và mở tập tin bản thân và tìm chức năng tôi cần, thay vì có IDE nhảy đến đó cho tôi.

Có một số giải pháp cho pycharm cụ thể hoặc với require.js chung để giải quyết vấn đề này không? Khi bạn có nhiều mã, nó trở thành một mớ hỗn độn để điều hướng nó, đó là lý do tại sao tôi sử dụng một IDE ngay từ đầu!

Và điều tồi tệ hơn: Trình chỉnh sửa không bao giờ biết những đối tượng chức năng nào có!

Một giải pháp có thể tôi có thể thấy là không sử dụng không gian tên kèm theo và khai báo biến toàn cục trước cuộc gọi define(), nhưng trong trường hợp này tất cả các đối tượng sẽ được gọi là UI_Message, AJAX_Requests. Để chắc chắn, tôi không có một số Thư ở hai địa điểm khác nhau ....

Và tôi không chắc chắn, nếu trình tối ưu hóa require.js sẽ sử dụng chính xác điều này. Tài liệu của Require.js nói rõ ràng, để tránh xa các biến toàn cầu.

+0

Điều này đã được khắc phục chưa? – singsuyash

Trả lời

8

Đây là số known issue, vui lòng gắn dấu sao/bỏ phiếu.

Từ mô tả vấn đề:

Thư viện võ đường chuyển sang định dạng của AMD xác định() để tải các module thay vì dojo.require(). Trước đây tôi đã có thể sử dụng Ctrl + B trên dojo.require ('path.to.someJs') để chuyển đến khai báo. Điều này không không hoạt động trên định dạng mới xác định (['path/to/someJs]', ...).

Như PyCharm, WebStorm, PhpStorm và IntelliJ IDEA chia sẻ cùng một plugin JavaScript, vấn đề này cũng áp dụng cho sản phẩm bạn đang sử dụng. Bạn sẽ tiếp tục quan sát vấn đề được mô tả cho đến khi lỗi này được sửa. Xin lỗi vì sự bất tiện.

+3

JetBrains đã thực hiện những điều cơ bản về vấn đề này, tuy nhiên, chúng vẫn không hỗ trợ cấu hình đường dẫn (bạn bị giới hạn ở đường dẫn tương đối) và bạn phải bấm vào bản thân xác định để vào mô-đun. :( –

+0

Bất kỳ cập nhật nào về điều này? – cdeszaq

+0

Nó cải thiện trong WebStorm 8. Các tính năng được yêu cầu * Tìm tập quán * và * Đi đến Tuyên bố * [công việc hiện đã] (http://stackoverflow.com/a/21954895/623816), tái cấu trúc vẫn cần một số cải tiến. –

3

WebStorm (ít nhất là 6.0.2) hỗ trợ chuyển hướng mã với RequireJs nếu bạn đang xác định các module của bạn với CommonJs wrapper và sử dụng xuất khẩu và đối số mô-đun:

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

Rõ ràng, nó hoạt động ngay cả khi module sử dụng nó không sử dụng định dạng wrapper CommonJs:

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

Nếu IDE khác sử dụng cùng một JavaScript plug-in như CrazyCoder nói, nó có thể làm việc trên các phiên bản mới hơn của họ là tốt.

Các vấn đề liên quan