có thể nhập một cái gì đó vào mô-đun cung cấp tên biến trong khi sử dụng ES6 nhập?
Tức là tôi muốn nhập một số mô-đun trong thời gian chạy tùy thuộc vào các giá trị được cung cấp trong cấu hình:
import something from './utils/' + variableName;
có thể nhập một cái gì đó vào mô-đun cung cấp tên biến trong khi sử dụng ES6 nhập?
Tức là tôi muốn nhập một số mô-đun trong thời gian chạy tùy thuộc vào các giá trị được cung cấp trong cấu hình:
import something from './utils/' + variableName;
Câu trả lời:
Không phải với import
tuyên bố. import
và export
được định nghĩa theo cách có thể phân tích tĩnh, vì vậy chúng không thể phụ thuộc vào thông tin thời gian chạy.
Bạn đang tìm kiếm API trình tải (polyfill) , nhưng tôi hơi không rõ về trạng thái của đặc điểm kỹ thuật:
System.import('./utils/' + variableName).then(function(m) {
console.log(m);
});
Ngoài câu trả lời của Felix , tôi sẽ lưu ý rõ ràng rằng điều này hiện không được phép trong ngữ pháp ECMAScript 6 :
Khai báo nhập khẩu :
nhập ImportClause FromClause;
nhập ModuleSpecifier;
FromClause :
- từ ModuleSpecifier
ModuleSpecifier :
- Chuỗi chữ
Một ModuleSpecifier chỉ có thể là một StringLiteral , không bất kỳ loại khác của biểu thức như một AdditiveExpression .
const
string literal
s. Chúng có thể phân tích tĩnh, phải không? Nó sẽ làm cho việc sử dụng lại vị trí của một phụ thuộc là một khả năng. (ví dụ: nhập một mẫu và có sẵn cả mẫu và vị trí của mẫu).
Trong khi đây thực sự không phải là nhập động (ví dụ: trong trường hợp của tôi, tất cả các tệp tôi đang nhập bên dưới sẽ được nhập và đóng gói bởi webpack, không được chọn trong thời gian chạy), một mẫu mà tôi đang sử dụng có thể hỗ trợ trong một số trường hợp là :
import Template1 from './Template1.js';
import Template2 from './Template2.js';
const templates = {
Template1,
Template2
};
export function getTemplate (name) {
return templates[name];
}
Hay cách khác:
// index.js
export { default as Template1 } from './Template1';
export { default as Template2 } from './Template2';
// OtherComponent.js
import * as templates from './index.js'
...
// handy to be able to fall back to a default!
return templates[name] || templates.Template1;
Tôi không nghĩ mình có thể trở lại tình trạng mặc định một cách dễ dàng với require()
, điều này gây ra lỗi nếu tôi cố gắng nhập một đường dẫn mẫu đã xây dựng không tồn tại.
Bạn có thể tìm thấy các ví dụ hay và so sánh giữa request và import tại đây: http://www.2ality.com/2014/09/es6-modules-final.html
Tài liệu tuyệt vời về cách xuất lại từ @iainastacio: http://exploringjs.com/es6/ch_modules.html#sec_all-exporting-styles
Tôi muốn nghe phản hồi về cách tiếp cận này :)
Object.values(templates)
.
Có một đặc điểm kỹ thuật mới được gọi là nhập động cho các mô-đun ES. Về cơ bản, bạn chỉ cần gọi import('./path/file.js')
và bạn có thể đi. Hàm trả về một lời hứa, sẽ giải quyết bằng mô-đun nếu quá trình nhập thành công.
async function importModule() {
try {
const module = await import('./path/module.js');
} catch (error) {
console.error('import failed');
}
}
Các trường hợp sử dụng bao gồm nhập thành phần dựa trên tuyến đường cho React, Vue, v.v. và khả năng lười tải các mô-đun , một khi chúng được yêu cầu trong thời gian chạy.
Đây là giải thích về Google Developers .
Theo MDN, nó được hỗ trợ bởi mọi trình duyệt lớn hiện tại (ngoại trừ IE) và caniuse.com cho thấy sự hỗ trợ 87% trên thị phần toàn cầu. Một lần nữa không hỗ trợ IE hoặc Edge non-chromium.
Tôi hiểu câu hỏi được hỏi cụ thể cho ES6 import
trong Node.js, nhưng điều sau có thể giúp những người khác đang tìm kiếm giải pháp chung chung hơn:
let variableName = "es5.js";
const something = require(`./utils/${variableName}`);
Lưu ý nếu bạn đang nhập một mô-đun ES6 và cần truy cập vào quá trình default
xuất, bạn sẽ cần sử dụng một trong các cách sau:
let variableName = "es6.js";
// Assigning
const defaultMethod = require(`./utils/${variableName}`).default;
// Accessing
const something = require(`./utils/${variableName}`);
something.default();
Bạn cũng có thể sử dụng cấu trúc hủy với cách tiếp cận này có thể thêm quen thuộc về cú pháp với các lần nhập khác của bạn:
// Destructuring
const { someMethod } = require(`./utils/${variableName}`);
someMethod();
Thật không may, nếu bạn muốn truy cập default
cũng như cấu trúc lại, bạn sẽ cần thực hiện việc này theo nhiều bước:
// ES6 Syntax
Import defaultMethod, { someMethod } from "const-path.js";
// Destructuring + default assignment
const something = require(`./utils/${variableName}`);
const defaultMethod = something.default;
const { someMethod, someOtherMethod } = something;
Tôi ít thích cú pháp này hơn, nhưng nó hoạt động:
thay vì viết
import memberName from "path" + "fileName";
// this will not work!, since "path" + "fileName" need to be string literal
sử dụng cú pháp này:
let memberName = require("path" + "fileName");
require()
là một phương thức Node.JS để tải tệp, là phiên bản đầu tiên. import
câu lệnh là phiên bản mới hơn, hiện là một phần của cú pháp ngôn ngữ chính thức. Tuy nhiên trong nhiều trường hợp trình duyệt sẽ sử dụng cái trước (sau khoa học). Câu lệnh request cũng sẽ tính tiền cho các tệp của bạn, vì vậy nếu tệp được tải lần thứ 2, tệp sẽ được tải từ bộ nhớ (hiệu suất tốt hơn). Cách nhập có những lợi ích riêng - nếu bạn đang sử dụng WebPack. thì webpack có thể loại bỏ các tham chiếu đã chết (các tập lệnh này sẽ không được tải xuống máy khách).
Nhập động () (khả dụng trong Chrome 63+) sẽ thực hiện công việc của bạn. Đây là cách thực hiện:
let variableName = 'test.js';
let utilsPath = './utils/' + variableName;
import(utilsPath).then((module) => { module.something(); });
./utils/test.js
export default () => {
doSomething...
}
cuộc gọi từ tệp
const variableName = 'test';
const package = require(`./utils/${variableName}`);
package.default();