我正在使用ECMAScript6模块.从以下选项中导出/导入模块中的多个方法的正确方法是什么?
单类静态方法:
//------ myClass.js ------
export default class myClass {
static myMethod1() {
console.log('foo');
}
static myMethod2(args...) {
console.log('bar');
}
}
//------ app.js ------
import myClass from 'myClass';
myClass.myMethod1(); //foo
Run Code Online (Sandbox Code Playgroud)
多种导出方法:
//------ myMethods.js ------
export function myMethod1() {
console.log('foo');
}
export function myMethod2() {
console.log('bar');
}
//------ app.js ------
import {myMethod1, myMethod2} from 'myMethods';
myMethod1() //foo;
//OR
import * as myMethods from 'myMethods';
myMethods.myMethod1() //foo;
Run Code Online (Sandbox Code Playgroud)
1)导出:一类只是静态方法感觉有点"代码味道",但同样单独导出所有内容确实感觉有点冗长.它只是开发人员偏好还是存在性能影响?
2)导入:'*as'语法是我首选的方法,因为它允许您使用点符号(引用模块和方法)帮助代码可读性.当我可能只使用其中一种方法时,这是否有性能影响?
我最近在Kyle Simpson的"你不了解JS:ES6"中读到了以下内容
"[ES6模块导出]实际绑定(几乎像指针)到内部模块定义中的标识符."
我的困惑是这些绑定与参考文献有何不同......
我理解JS 中的引用只适用于非原始类型(如对象),因此给定
let object1 = {a: 1};
let object2 = object1;
Run Code Online (Sandbox Code Playgroud)
object1而object2现在所说的(他们是两个参考点)同一个对象.
如果我添加一个属性object2,我也添加了一个属性object1
object2.b = 2;
console.log(object1.b); // 2
Run Code Online (Sandbox Code Playgroud)
我可以看到绑定可以应用于基本类型和非基元类型
// foo.js
export let count = 1;
export function incrementCount() { count++; }
// bar.js
import {count, incrementCount} from foo;
console.log(count); // 1
incrementCount();
console.log(count); // 2
Run Code Online (Sandbox Code Playgroud)
绑定就像引用一样,除了原始值也可以共享绑定(而引用仅限于非基本类型)?
我觉得我在这里错过了一些东西......
据我所知(参见16.3.2.1节),ES6允许函数/类导出操作数的不同语法.差异是指导出的函数是否需要在导入时解释为函数声明,在这种情况下,您可以编写:export default function () {} // (a)或作为函数表达式:export default (function () {}); // (b).
作为一个可能的相关旁注:我读到进口是悬挂的,但我不确定这意味着什么.
以这个例子为例:
import foo from 'my_module'; // (c)
据我了解,上面的语句将我的导出函数保存在foo变量中.这个变量是悬挂的,或是什么,何时?
最重要的是,foo当my_module使用函数(a)和使用函数导出时,有什么区别(在设置方面)(b)?
因为我读这里,ES2015可以导出var,const,let,function,class和default.
export var myVar1 = ...;
export let myVar2 = ...;
export const MY_CONST = ...;
export function myFunc() {
...
}
export function* myGeneratorFunc() {
...
}
export class MyClass {
...
}
Run Code Online (Sandbox Code Playgroud)
但我不明白为什么.在我的外行看来,应该有named exports和default exports.
您输出的类型似乎并不重要.我的意思是,当你export default,你指定类型?不,你没有,它的工作原理.此外,它还能有什么区别出口var或let?它有什么区别export const?导入模块时,无论如何它都是不可变的(AFAIK).
那么,为什么必须指定导出的类型?
javascript commonjs node-modules ecmascript-6 ecmascript-2015
在javascript ES-2015模块中,模块成员是否可以了解其他模块成员?
例如,在CommonJS模块中,这是可能的:
function square(x) {
return x * x;
}
function whoAmI() {
return Object.keys(module.exports); // ['square','whoAmI']
}
module.exports = {
square: square,
whoAmI: whoAmI
};
Run Code Online (Sandbox Code Playgroud)
在等效的ES-2015模块中,我们如何编写whoAmI()函数?
export function square(x) {
return x * x;
}
export function whoAmI() {
// ?????
}
Run Code Online (Sandbox Code Playgroud) javascript ×5
ecmascript-6 ×4
es6-modules ×3
class ×1
commonjs ×1
module ×1
node-modules ×1
reference ×1