Javascript 将选项传递给ES6模块导入
是否可以将选项传递给ES6导入 你如何翻译这个:Javascript 将选项传递给ES6模块导入,javascript,module,ecmascript-6,es6-modules,Javascript,Module,Ecmascript 6,Es6 Modules,是否可以将选项传递给ES6导入 你如何翻译这个: var x = require('module')(someoptions); 对于ES6?使用单个import语句无法做到这一点,它不允许调用 因此,您不会直接调用它,但您基本上可以像commonjs对默认导出所做的那样: // module.js export default function(options) { return { // actual module } } // main.js impor
var x = require('module')(someoptions);
对于ES6?使用单个
import
语句无法做到这一点,它不允许调用
因此,您不会直接调用它,但您基本上可以像commonjs对默认导出所做的那样:
// module.js
export default function(options) {
return {
// actual module
}
}
// main.js
import m from 'module';
var x = m(someoptions);
或者,如果您使用支持承诺的模块加载器,您可能可以执行以下操作
System.import('module').ap(someoptions).then(function(x) {
…
});
随着新技术的发展,它可能会成为
const promise = import('module').then(m => m(someoptions));
或
但是,您可能不需要动态导入,而需要静态导入。我相信您可以使用es6模块加载程序。
System.import(“lib/math”)。然后(函数(m){
m(您在此处的选择);
});
概念
下面是我使用ES6的解决方案
与@Bergi的响应非常一致,这是我在创建需要为class
声明传递参数的导入时使用的“模板”。这是在我正在编写的同构框架上使用的,因此将在浏览器和node.js中使用transpiler(我使用Babel
和Webpack
):
/MyClass.js
export default (Param1, Param2) => class MyClass {
constructor(){
console.log( Param1 );
}
}
import MyClassFactory from './MyClass.js';
let MyClass = MyClassFactory('foo', 'bar');
let myInstance = new MyClass();
/main.js
export default (Param1, Param2) => class MyClass {
constructor(){
console.log( Param1 );
}
}
import MyClassFactory from './MyClass.js';
let MyClass = MyClassFactory('foo', 'bar');
let myInstance = new MyClass();
上述命令将在控制台中输出foo
编辑
现实世界的例子
对于一个真实的例子,我使用它来传入一个名称空间,以便访问框架中的其他类和实例。因为我们只是创建一个函数并将对象作为参数传入,所以我们可以将它与类声明一起使用,如下所示:
export default (UIFramework) => class MyView extends UIFramework.Type.View {
getModels() {
// ...
UIFramework.Models.getModelsForView( this._models );
// ...
}
}
考虑到它是一个完整的框架,在我的例子中,导入有点复杂,而且是自动的,但本质上是这样的:
// ...
getView( viewName ){
//...
const ViewFactory = require(viewFileLoc);
const View = ViewFactory(this);
return new View();
}
// ...
我希望这有帮助 在@Bergi的基础上使用es6将如下
//原件
var debug=require('debug')('http');
//ES6
从“调试”导入*作为调试;
const debug=debug('http');
//在代码中正常使用
调试(“你好,世界!”);
您只需添加这两行即可
import xModule from 'module';
const x = xModule('someOptions');
以下是我对这个问题的看法,以调试模块为例 在本模块的npm页面上,您有: var debug=require('debug')('http')) 在上面的一行中,一个字符串被传递给导入的模块,以进行构造。以下是您在ES6中的操作方法
从“调试”导入{debug as debug} const debug=debug('http')
希望这对其他人有所帮助。我找到了这条类似的线索,我想提出一种解决方案,至少在某些情况下是这样(但请参见下面的备注) 用例 我有一个模块,它在加载时立即运行一些实例化逻辑。我不喜欢在模块外调用这个init逻辑(这与调用
newsomeclass(p1,p2)
或new((p1,p2)=>classsomeclass{…p1…p2…})
等类似)
我确实喜欢这个init逻辑只运行一次,有点像一个单一的实例化流,但是每个特定的参数化上下文运行一次
示例
service.js
的基本范围是:
let context=null;//与此同时,我只想保持现状
log('initialized in context'+(context?context:'root');
模块A包括:
import*as S from'service.js';//控制台现在已“在上下文根目录中初始化”
模块B包括:
import*as S from'service.js';//控制台保持不变!模块的脚本只运行一次
到目前为止还不错:服务对两个模块都可用,但只初始化了一次
问题
如何使它作为另一个实例运行,并在另一个上下文中(比如在模块C中)再次初始化自身
解决方案?
这就是我所想的:使用查询参数。在服务中,我们将添加以下内容:
let context=newurl(import.meta.URL).searchParams.get('context')代码>
模块C将做:
import*as S from'service.js?context=special';
模块将被重新导入,它的基本初始化逻辑将运行,我们将在控制台中看到:
在特殊上下文中初始化
备注:我自己建议不要经常练习这种方法,但将其作为最后手段。为什么?多次导入的模块与其说是规则,不如说是一个例外,所以这是某种意外的行为,因此可能会混淆消费者,甚至打破它自己的“单例”范式(如果有的话)
不确定是否可以,有一个模块加载器API,或者至少有一段时间,使用了类似于System.import(module)
,不确定是否允许参数,了解ES6的人可能会这样做?有一个建议的解决方案,node.js中已经有了实现(通过插件)和网页:谢谢你,我希望有类似的从'module'导入x使用someoptions代码>有点syntax@Fabrizio当前位置如果你再仔细考虑一下,就不会有多大帮助了。它只在模块导出函数时才起作用,如果我们已经命名了imports(即,import{x,y}来自'module'
),则可能不允许使用它。如果我想传递多个参数,那么语法应该是什么?还是散布一系列的论点?这是一个狭隘的用例,基本上你试图为函数调用添加不同的语法,但我们已经有函数调用,可以处理所有其他情况。@FelixKling我完全同意你的看法。我正在转换一个旧的express webapp,遇到var session=require('express-session');var redistore=require('connect-redis')(会话)代码>我只是想知道是否有一行解决方案。我完全可以通过将Redistore任务分成两行来生存:)@FabrizioGiordano:I cou