import和export模块化功能
在javascript中一个文件为一个独立的模块,要想在文件外部访问其他文件的内容,需要使用import导入外部模块,使用export导出对应的模块。
1.export命令
下面代码使用export导出变量
1 | export let name = "Bob"; |
除了上面的写法,我们更推荐下面这种写法
1 | let name = "Bob"; |
以上两种写法是等价的,但是我们更推荐第二种,因为第二种写法能更加直观的看出需要输出哪些变量。
export命令除了输出变量之外,还可以输出函数、class类等
1 | export function sum(x, y){ |
除了输出函数本来的名称之外,我们还可以使用as关键字给输出的函数重命名
1 | function f1(){ //... } |
注意的是export命令规定的是对外输出的接口,必须与模块内部的变量建立一一对应的关系,我们把一个对象想象为一个映射关系,就不难理解了。下面这类写法,就是错误的。
1 | // 报错 |
2.import命令
使用export定义了对外接口之后,可以使用import加载这个模块
1 | import { sum } from './test.js'; |
我们也可以使用as关键字对导入的模块进行重命名
1 | import { sum as myFun } from './test.js'; |
import命令导入的内容是只读的,因为它的本质是输入接口。也就是说,不允许在加载模块的脚本里面,改写接口。
1 | import { a } from './test.js'; |
但是如果导入的内容是一个对象,我们进行对象属性的改写,这是允许的操作。
1 | import { obj } from './test.js'; |
虽然对导入对象的属性改写是合法的,在其他模块中也能读取到这里的改写,但这类操作导致错误难以追踪,为了程序的可维护性,我们建议导入的内容执行只读操作,不轻易做更改。
3.模块的整体加载
除了上面案例中的一一对应加载,我们还可以使用*
符号指定一个对象整体加载模块。
1 | // all.js |
下面整体加载该模块
1 | import * as all from './all.js'; |
4.export default
到这为止,上面的案例导入时都需要知道内容的名称,使用export default命令,默认导出default名称的内容,我们可以给导入的模块取任意名称。
1 | export default function fn(){ |
上面两组代码,使用export default输出时,import导入不需要大括号,而使用export时则需要;export default默认输出时只允许一个输出,而使用export正常输出可以有多个。