Tôi có các hàm IIFE cho một số mã thư viện trong một ứng dụng cũ cần hoạt động cho IE10 + (Không tải mô-đun ES6, v.v.).
Tuy nhiên, tôi đang bắt đầu phát triển ứng dụng React sẽ sử dụng ES6 và TypeScript và tôi muốn sử dụng lại mã mà tôi đã có mà không cần sao chép các tệp. Sau một chút nghiên cứu, tôi thấy rằng tôi muốn sử dụng mẫu UMD để cho phép các tệp thư viện này hoạt động như <script src=*>
nhập khẩu và cho phép ứng dụng React nhập chúng thông qua tải mô-đun ES6.
Tôi đã đưa ra các chuyển đổi sau đây:
var Utils = (function(){
var self = {
MyFunction: function(){
console.log("MyFunction");
}
};
return self;
})();
đến
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(factory((global.Utils = {})));
}(this, (function (exports) {
exports.MyFunction = function(){
console.log("MyFunction");
};
})));
Điều này sẽ cho phép tải thông qua Import Utils from './Utils.js'
lệnh và cũng cho phép nó được chèn bằng thẻ script<script src='Utils.js'></script>
Tuy nhiên, một số IIFE của tôi sử dụng các IIFE khác như một sự phụ thuộc (xấu tôi biết nhưng thực tế).
var Utils = Utils; // Used to indicate that there is dependency on Utils
var RandomHelper = (function(){
var self = {
DoThing: function(){
Utils.MyFunction();
}
};
return self;
})();
Nếu biến chính xác RandomHelper
và Utils
thành các tệp có thể được nhập, ứng dụng React không tương thích với kỹ thuật này. Làm đơn giản
Import Utils from './Utils.js'
Import RandomHelper from './RandomHelper.js'
không hoạt động vì tôi tin Utils không nằm trong phạm vi cửa sổ. Nó sẽ tải mà không có vấn đề nhưng RandomHelper.DoThing()
sẽ ném rằng Utils không được xác định.
Trong ứng dụng cũ
<script src='Utils.js'></script>
<script src='RandomHelper.js'></script>
hoạt động hoàn hảo.
Làm cách nào để RandomHelper có thể sử dụng Utils trong ứng dụng React, giữ cho nó tương thích với IE và ES5 nhưng vẫn hoạt động bình thường. Có lẽ bằng cách nào đó thiết lập một cửa sổ / biến toàn cầu?
PS: Tôi hiểu rằng quan điểm của việc tải mô-đun ES6 là để đối phó với các phụ thuộc và IIFE hiện tại của tôi không lý tưởng. Tôi dự định cuối cùng sẽ chuyển đổi các lớp es6 và kiểm soát phụ thuộc tốt hơn nhưng hiện tại tôi muốn sử dụng những gì có sẵn mà không cần viết lại