Tôi vẫn muốn biết làm thế nào tôi có thể tìm thấy vị trí trong mã nguồn của chúng tôi đã gây ra sự cố này, nhưng tôi đã có thể tìm thấy sự cố theo cách thủ công.
Đã có một hàm điều khiển được khai báo trên phạm vi toàn cục, thay vì sử dụng .controller()
lệnh gọi trên mô-đun ứng dụng.
Vì vậy, có một cái gì đó như thế này:
function SomeController( $scope, i18n ) { /* ... */ }
Điều này hoạt động tốt với AngularJS, nhưng để làm cho nó hoạt động đúng với mangling, tôi đã phải thay đổi nó thành:
var applicationModule = angular.module( "example" );
function SomeController( $scope, i18n ) { /* ... */ }
applicationModule.controller( "SomeController", [ "$scope", "i18n", SomeController ] );
Sau khi kiểm tra thêm, tôi thực sự tìm thấy các trường hợp của nhiều bộ điều khiển hơn cũng gây ra sự cố. Đây là cách tôi tìm thấy nguồn của tất cả chúng theo cách thủ công :
Trước hết, tôi cho rằng việc kích hoạt tính năng làm đẹp đầu ra trong các tùy chọn uglify là khá quan trọng. Đối với nhiệm vụ khó chịu của chúng tôi có nghĩa là:
options : {
beautify : true,
mangle : true
}
Sau đó, tôi đã mở trang web của dự án trong Chrome với DevTools đang mở. Dẫn đến lỗi như lỗi dưới đây được ghi lại:
Phương thức trong dấu vết cuộc gọi mà chúng tôi quan tâm, là phương thức tôi đã đánh dấu bằng mũi tên. Đây là providerInjector
tronginjector.js
. Bạn sẽ muốn đặt một điểm ngắt ở đó nó ném một ngoại lệ:
Khi bạn chạy lại ứng dụng bây giờ, điểm ngắt sẽ được nhấn và bạn có thể nhảy lên ngăn xếp cuộc gọi. Sẽ có một cuộc gọi từ bên invoke
tronginjector.js
, có thể nhận ra từ chuỗi "Mã thông báo chèn không chính xác":
Các locals
tham số (đọc sai để d
trong mã của tôi) đưa ra một ý tưởng khá tốt về những đối tượng trong nguồn của bạn là vấn đề:
Xem nhanh grep
nguồn của chúng tôi tìm thấy nhiều trường hợp modalInstance
, nhưng từ đó, thật dễ dàng tìm thấy điểm này trong nguồn:
var ModalCreateEditMeetingController = function( $scope, $modalInstance ) {
};
Cái nào phải được thay đổi thành:
var ModalCreateEditMeetingController = [ "$scope", "$modalInstance", function( $scope, $modalInstance ) {
} ];
Trong trường hợp biến không chứa thông tin hữu ích, bạn cũng có thể nhảy lên thêm ngăn xếp và bạn nên thực hiện lệnh gọi invoke
mà biến đó sẽ có thêm gợi ý:
Ngăn điều này xảy ra lần nữa
Bây giờ hy vọng bạn đã tìm ra vấn đề, tôi cảm thấy rằng tôi nên đề cập đến cách tốt nhất để tránh điều này xảy ra lần nữa trong tương lai.
Rõ ràng, bạn chỉ có thể sử dụng các chú thích mảng inline ở khắp mọi nơi, hoặc (tùy thuộc vào sở thích của bạn) $inject
chú thích bất động sản và chỉ đơn giản là cố gắng không để quên nó trong tương lai. Nếu bạn làm như vậy, hãy đảm bảo bật chế độ tiêm phụ thuộc nghiêm ngặt để phát hiện sớm các lỗi như thế này.
Coi chừng! Trong trường hợp bạn đang sử dụng Angular Batarang, Nghiêm ngặtDI có thể không phù hợp với bạn, vì Angular Batarang đưa mã không có chú thích vào của bạn (Batarang không tốt!).
Hoặc bạn có thể để ng-annotate chăm sóc nó. Tôi thực sự khuyên bạn nên làm như vậy, vì nó loại bỏ rất nhiều khả năng mắc sai lầm trong lĩnh vực này, như:
- Thiếu chú thích DI
- Chú thích DI chưa hoàn thành
- Chú thích DI sai thứ tự
Giữ cho các chú thích được cập nhật chỉ đơn giản là một nỗi đau và bạn không cần phải làm điều đó nếu nó có thể được thực hiện tự động. ng-annotate thực hiện chính xác điều đó.
Nó sẽ tích hợp độc đáo vào quy trình xây dựng của bạn với grunt-ng-annotate và gulp-ng-annotate .