Подтвердить что ты не робот

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)

4b9b3361

Ответ 1

Есть ли способ импортировать все именованные модули без псевдонима, например import {*} из './A' (вместо 2nd в B.js)

Нет.

И вся идея реэкспорта больше, чем нужно, чтобы сохранить "количество строк" в окончательном файле js, как вы заявили в

Bcz, он помещает две строки для каждого импорта в окончательном файле JS. Учтите, что если есть 10 строк импорта, то в финальной версии будут добавлены 20 строк. Когда вы думаете о производстве, это будет слишком дорого

Не имеет особого смысла, так как это то, что для JS Minifiers.

Подводя итог: не следует делать это с самого начала:

  1. Вы export только то, что вам нужно для экспорта
  2. Вы import все, что вам нужно, куда вам нужно.
  3. Вы используете минификаторы 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"