Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将选项传递给ES6模块导入_Javascript_Module_Ecmascript 6_Es6 Modules - Fatal编程技术网

Javascript 将选项传递给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

是否可以将选项传递给ES6导入

你如何翻译这个:

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