default export:每个 module 只能有一个(单个默认导出,通常是一个 function 或 class)
可以同时使用两者,但通常最好分开使用。
named export
// 导出 name list
export { myFunction2, myVariable2 } // 不能是 empty object
// 支持 var, let, const, function, class)
export let myVariable = Math.sqrt(2)
export function myFunction() { }
// file-1 lib.js
export const sqrt = Math.sqrt
export function square(x) {
return x * x
}
export function diag(x, y) {
return sqrt(square(x) + square(y))
}
// file-2 main.js
// 可以分开导入(更推荐)
import { square, diag } from 'lib'
console.log(square(11))
console.log(diag(4, 3))
// 也可以导入完整的模块
import * as lib from 'lib'
console.log(lib.square(11))
console.log(lib.diag(4, 3))
// 以下两行等价
export { myFunction as default }
export default myFunction
// 用 as 重新命名
export { variable1 as name1, variable2 as name2, ... nameN }
export { variable1 as "string name" } //
export { myFunction as "my-function" } // rename 成一个 not a valid identifier
// 导出单个的
export default function () { }
export default class { }
// 支持任何表达式
export default 1 + 1
re-export 或聚合
export { default as function1, function2 } from "bar.js"
// 等价于 import/export
import { default as function1, function2 } from "bar.js"
export { function1, function2 }
// 大多数 `import from` 语法都有对应的 `export from` 语法
export { default as DefaultExport } from "bar.js"
export { default, function2 } from "bar.js" // as 可省
2. import 声明
两种方式:
import declaration:只能用于 modules 中,且只能在 top-level(不能在 block 或 function 里)
import 声明的四种形式:
named import
default import
namespace import
side effect import
// 1. named import
import { foo, bar } from "/modules/my-module.js"
import { myExport } from "/modules/my-module.js"
import { myExport as a } from "/modules/my-module.js"
// 2. default import
import myDefault from "/modules/my-module.js"
import { default as myDefault } from "/modules/my-module.js"
// 3. namespace import
import * as namespaceObject from "module-name"
// 注意:JavaScript 没有像 import * from "module-name" 这样的通配符导入
// 因为名称冲突的可能性很高
// 4. side effect import
// 这会运行模块的 global code,但并不会导入任何值
// 通常用于改变全局变量的 polyfill
import "/modules/my-module.js"
静态 import 声明用来导入 read-only live bindings(只读实时绑定),之所以叫 live bindings,是因为它们的值只能由 export 绑定的模块来更新,而 import 它的模块不能 re-assign。