[英]es6 - import all named module without alias
我知道我们可以使用别名导入所有命名模块,如下所示,
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)时,我需要导入所有文件中的所有命名模块,并且需要执行(重新)导出相同的操作在所有。 而不是这样做,
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)
js
import BaseComponent from './A';
import {React, I18n, m1, m2) from './A;
export default class B extends A {}
有没有办法导入所有没有别名的命名模块,比如import {*} from './A'
(而不是 B.js 中的第二个)
有没有办法导入所有没有别名的命名模块,比如 import {*} from './A' (而不是 B.js 中的第二个)
不。
并且重新导出的整个想法超出了您在最终 js 文件中保存“行数”所需的数量,正如您在
因为,它在最终的 js 文件中为每个导入放置了两行。 考虑如果导入的行数超过 10 行,则最终 js 中将添加 20 行。 当您考虑生产时,成本太高
没有多大意义,因为这就是 JS 缩小器的用途。
总结一下:一开始就不应该这样做:
export
只有你需要什么出口import
所需的任何内容。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);
这是我做的一个疯狂的实验,它有效,但它可能以我不完全理解的方式危险。 有人会向我解释为什么我们不这样做吗?
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
)。
您应该能够按如下方式使用它(尽管您可能不应该像上面所说的那样)。
import BaseComponent, * as extras from './A';
eval($localizeAll("extras"));
export default class B extends BaseComponent {}
无论如何,无法抗拒尝试这个;)
global
是你在 node.js 中的当前作用域,类似于浏览器中的window
对象,因此你可以导入到这个对象中。
从 util 模块导入所有符号:
import * as util from "./util";
util.importAll(util, global);
在 util.js 中:
/**
* Takes all functions/objects from |sourceScope|
* and adds them to |targetScope|.
*/
function importAll(sourceScope, targetScope) {
for (let name in sourceScope) {
targetScope[name] = sourceScope[name];
}
}
...以及许多其他函数,如assert()
等,我在任何地方都需要它们,它们应该是 JavaScript 语言的一部分,但还没有。 但正如其他人所说,请谨慎使用。
现在,没有干净的方法可以做到这一点。 但是你可以通过以下方式克服这个问题:
1) 定义别名
import * as foo from "foo"
2)编写所有模块
import {a,b,c,d,...} from "foo"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.