export 对外暴露对象,import 从其他模块导入对象。
形式
// 单独导出:export var name = 'foo module'export function hello () {console.log('hello')}export class Person {}// 末尾集中导出:var name = 'foo module'function hello () {console.log('hello')}class Person {}export { name, hello, Person }// 重命名:var name = 'foo module'export { name as fooName }// 或者export { fooName: name }// 导入用以上方式导出的模块import { name, hello, Person } from './文件名.js'// 默认导出export {name as default}// 或者export default name//或者export default {name, ...}// 使用第一种默认导出,导入时应该命名import { default as fooName } from './文件名.js'// 使用第二、三种默认导出,导入时应该是以导入变量的形式,去掉大括号import fooName from './文件名.js'
需要注意
- export { name, hello, Person } 这种写法并非导出一个对象字面量,它是一种规定写法。 export default { name, hello, Person } 才是导出一个对象。
- export 导出的是对象的引用关系,import 导入的也是这个引用关系,不是复制了一个一样的对象。当导出的对象在文件中发生变化,对象引用时也会发生变化。 ```javascript var name = ‘foo module’ export { name }
setTimeout(() => { name = “hello” }, 1000)
// 引用 import { name } from ‘./文件名.js’ console.log(name) // 输出 “foo module”
setTimeout(() => { console.log(name) // 输出 “hello” }, 1500)
3. import 导入的对象是一个常量,不能修改值。3. import 的一些问题。- 在没有打包工具的情况下,不能省略 .js 的扩展名。```javascriptimport { name } from './文件名' // 报错import { name } from './文件名.js' // 正常console.log(name)
在没有打包工具的情况下,导入一个有 index.js 的文件夹,不能省略 index.js。
import { lowercase } from './文件夹' // 报错import { lowercase } from './文件夹/index.js' // 正常console.log(lowercase('HHH'))
点斜杠 ‘./‘ 不能省略,如果省略 import 会认为是在导入第三方模块。也可以用全路径或者 url 加载。
import { name } from '文件名.js' // 报错import { name } from './文件名.js' // 正常import { name } from '/文件夹/文件名.js' // 正常import { name } from 'http://localhost:3000/文件夹/文件名.js' // 正常console.log(name)
只是需要执行模块而不需要成员的话。可以用以下两种方式,但这时不再能使用其成员。
import {} from './文件名.js'import './文件名.js'
用 * 号导出所有成员,并用一个对象名接收。
import * as mod from './文件名.js'console.log(mod)
用 import() 函数实现动态加载。 ```javascript // 错误 var modulePath = ‘./文件名.js’ import { name } from modulePath console.log(name)
// 错误 if (true) { import { name } from ‘./文件名.js’ }
// 正常 import(‘./文件名.js’).then(function (module) { console.log(module) })
- 一个模块,既有命名成员,又有默认成员。可以用过两种方式同时导入。```javascript// 导出var name = 'jack'var age = 18export { name, age }console.log('module action')export default 'default export'// 导入方式一import { name, age, default as title } from './文件名.js'// 导入方式二import abc, { name, age } from './文件名.js'
直接导出导入的成员
一般在 index.js 中导入文件夹中的所有模块成员,并直接导出。直接导出无法访问模块成员。
export { default as Button } from './文件1.js'export { Avatar } from './文件2.js'
