export 对外暴露对象,import 从其他模块导入对象。

形式

  1. // 单独导出:
  2. export var name = 'foo module'
  3. export function hello () {
  4. console.log('hello')
  5. }
  6. export class Person {}
  7. // 末尾集中导出:
  8. var name = 'foo module'
  9. function hello () {
  10. console.log('hello')
  11. }
  12. class Person {}
  13. export { name, hello, Person }
  14. // 重命名:
  15. var name = 'foo module'
  16. export { name as fooName }
  17. // 或者
  18. export { fooName: name }
  19. // 导入用以上方式导出的模块
  20. import { name, hello, Person } from './文件名.js'
  21. // 默认导出
  22. export {
  23. name as default
  24. }
  25. // 或者
  26. export default name
  27. //或者
  28. export default {
  29. name, ...
  30. }
  31. // 使用第一种默认导出,导入时应该命名
  32. import { default as fooName } from './文件名.js'
  33. // 使用第二、三种默认导出,导入时应该是以导入变量的形式,去掉大括号
  34. import fooName from './文件名.js'

需要注意

  1. export { name, hello, Person } 这种写法并非导出一个对象字面量,它是一种规定写法。 export default { name, hello, Person } 才是导出一个对象。
  2. 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)

  1. 3. import 导入的对象是一个常量,不能修改值。
  2. 3. import 的一些问题。
  3. - 在没有打包工具的情况下,不能省略 .js 的扩展名。
  4. ```javascript
  5. import { name } from './文件名' // 报错
  6. import { name } from './文件名.js' // 正常
  7. console.log(name)
  • 在没有打包工具的情况下,导入一个有 index.js 的文件夹,不能省略 index.js。

    1. import { lowercase } from './文件夹' // 报错
    2. import { lowercase } from './文件夹/index.js' // 正常
    3. console.log(lowercase('HHH'))
  • 点斜杠 ‘./‘ 不能省略,如果省略 import 会认为是在导入第三方模块。也可以用全路径或者 url 加载。

    1. import { name } from '文件名.js' // 报错
    2. import { name } from './文件名.js' // 正常
    3. import { name } from '/文件夹/文件名.js' // 正常
    4. import { name } from 'http://localhost:3000/文件夹/文件名.js' // 正常
    5. console.log(name)
  • 只是需要执行模块而不需要成员的话。可以用以下两种方式,但这时不再能使用其成员。

    1. import {} from './文件名.js'
    2. import './文件名.js'
  • 用 * 号导出所有成员,并用一个对象名接收。

    1. import * as mod from './文件名.js'
    2. 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) })

  1. - 一个模块,既有命名成员,又有默认成员。可以用过两种方式同时导入。
  2. ```javascript
  3. // 导出
  4. var name = 'jack'
  5. var age = 18
  6. export { name, age }
  7. console.log('module action')
  8. export default 'default export'
  9. // 导入方式一
  10. import { name, age, default as title } from './文件名.js'
  11. // 导入方式二
  12. import abc, { name, age } from './文件名.js'

直接导出导入的成员

一般在 index.js 中导入文件夹中的所有模块成员,并直接导出。直接导出无法访问模块成员。

  1. export { default as Button } from './文件1.js'
  2. export { Avatar } from './文件2.js'