Es6 - импортировать все именованные модули без псевдонима
Я знаю, что мы можем импортировать все именованные модули с псевдонимом, как показано ниже,
import * as name from "module-name";
Ссылка: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import
На самом деле, я повторно экспортировал свои модули в A.js и тот же наследуется в B.js. PFB. Теперь это два уровня наследования, поэтому неважно импортировать именованные модули. Но, когда я беру это до 5 уровней наследования (A → B → C → D → E), мне нужно импортировать все именованные модули во все файлы и вам нужно будет (re) экспортировать одинаковые в целом. Вместо этого
- Есть ли другой способ скопировать область всех именованных модулей на все уровни без повторения колеса (Импорт и экспорт).
- За сценой этого дизайна нужно заставить их следовать концепции Opps и избегать переоформления тех же модулей.
A.js
import React from 'react';
import I18n from 'i18n-js';
import m1 from 'module1';
import m2 from 'module2';
export default class A extends React.Component {}
export {React, I18n, m1, m2)
B.js
import BaseComponent from './A';
import {React, I18n, m1, m2) from './A;
export default class B extends A {}
Есть ли способ импортировать все именованные модули без псевдонимов, таких как import {*} from './A'
(вместо 2-го в B.js)
Ответы
Ответ 1
Есть ли способ импортировать все именованные модули без псевдонима, например import {*} из './A' (вместо 2nd в B.js)
Нет.
И вся идея реэкспорта больше, чем нужно, чтобы сохранить "количество строк" в окончательном файле js, как вы заявили в
Bcz, он помещает две строки для каждого импорта в окончательном файле JS. Учтите, что если есть 10 строк импорта, то в финальной версии будут добавлены 20 строк. Когда вы думаете о производстве, это будет слишком дорого
Не имеет особого смысла, так как это то, что для JS Minifiers.
Подводя итог: не следует делать это с самого начала:
- Вы
export
только то, что вам нужно для экспорта - Вы
import
все, что вам нужно, куда вам нужно. - Вы используете минификаторы JS для оптимизации размера выходного файла JS.
Ответ 2
Здесь я провел сумасшедший эксперимент, который работает, но он, вероятно, опасен, и я до конца не понимаю. Кто-нибудь объяснит мне, почему мы этого не делаем?
var lodash = require("lodash");
function $localizeAll(name) {
return 'eval("var " + Object.getOwnPropertyNames(${name}).reduce((code, prop)=>{
if (/^[a-zA-Z$_][a-zA-Z$_0-9]*$/.test(prop)) {
return code.concat(\'\${prop} = ${name}["\${prop}"]\n\');
} else {
console.warn("did not import '" + prop + "'");
return code;
}
}, []).join(", ")+";")'
}
// this will make all exports from lodash available
eval($localizeAll("lodash"));
console.log(add(indexOf([1,2,6,7,12], 6), 5)); // => 7
Он немного сложен, так как разворачивается на двух уровнях, но он в основном повторяет все свойства объекта с заданным именем в области видимости и связывает все свойства, имена которых квалифицируются как идентификаторы, с идентификатором по этому имени:
var length = lodash["length"]
, name = lodash["name"]
, arguments = lodash["arguments"]
, caller = lodash["caller"]
, prototype = lodash["prototype"]
, templateSettings = lodash["templateSettings"]
, after = lodash["after"]
, ary = lodash["ary"]
, assign = lodash["assign"]
, assignIn = lodash["assignIn"]
, assignInWith = lodash["assignInWith"]
, assignWith = lodash["assignWith"]
, at = lodash["at"]
, before = lodash["before"]
, bind = lodash["bind"]
, bindAll = lodash["bindAll"]
, bindKey = lodash["bindKey"]
//...
, upperCase = lodash["upperCase"]
, upperFirst = lodash["upperFirst"]
, each = lodash["each"]
, eachRight = lodash["eachRight"]
, first = lodash["first"]
, VERSION = lodash["VERSION"]
, _ = lodash["_"]
;
В этом списке есть несколько примеров того, почему это плохая идея (например, она скрывает arguments
).
Вы должны быть в состоянии использовать это следующим образом (хотя вам, вероятно, не понравится, что они говорят выше).
B.js
import BaseComponent, * as extras from './A';
eval($localizeAll("extras"));
export default class B extends BaseComponent {}
Во всяком случае, не удержался, попробовав это;)
Ответ 3
Решение JavaScript:
import * as exports from 'foo';
Object.entries(exports).forEach(([name, exported]) => window[name] = exported);
Примечание: импортированный объект оболочки остается там.
Решение Node.js:
Object.entries(require('foo')).forEach(([name, exported]) => global[name] = exported);
Ответ 4
Пока нет чистого способа сделать это. Но вы можете решить эту проблему:
1) определение псевдонима
import * as foo from "foo"
2) написание всех модулей
import {a,b,c,d,...} from "foo"