将选项传递给ES6模块导入
是否有可能将选项传递给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);
另外,如果你使用一个支持monadic promise的模块加载器,你也许可以做类似的事情
System.import('module').ap(someoptions).then(function(x) { … });
概念
这是我使用ES6的解决方案
非常符合@ Bergi的回应,这是创建导入时需要使用的“模板”,需要为class
声明传递的参数。 这是在我正在写的同构框架上使用,所以将在浏览器和node.js中使用一个转译器(我使用Webpack
Babel
):
./MyClass.js
export default (Param1, Param2) => class MyClass { constructor(){ console.log( Param1 ); } }
./main.js
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 ); // ... } }
输入是一个复杂和automagical
在我看来,这是一个完整的框架,但基本上这是发生了什么事情:
// ... getView( viewName ){ //... const ViewFactory = require(viewFileLoc); const View = ViewFactory(this); return new View(); } // ...
我希望这有帮助!
建立在@ Bergi 答案使用调试模块使用es6将是以下
// original var debug = require('debug')('http'); // ES6 import * as Debug from 'debug'; const debug = Debug('http'); // Use in your code as normal debug('Hello World!');
我相信你可以使用es6模块装载机。 http://babeljs.io/docs/learn-es6/
System.import("lib/math").then(function(m) { m(youroptionshere); });