import和require区别

232 阅读2分钟

1. import

  • import命令输入的变量都是只读的
  • import命令具有提升效果,会提升到整个模块的头部,首先执行(这种行为的本质是,import命令是编译阶段执行的,在代码运行之前)
  • import是静态执行,所以不能使用表达式和变量
  • import语句是单例(Singleton)模式(多次用import引入同一个模块时,只会引入一次该模块的实例)
// 静态加载
import BaseLayout from '@/components/Layout/BaseLayout';
export default {
  components: {
    BaseLayout
  }
}

// 动态加载。配合webpack,可以做到分片打包加载
export default {
  components: {
    BaseLayout: () => import(/* webpackChunkName: 'BaseLayout' */ '@/components/Layout/BaseLayout')
  }
}

import()特点

  • 特点 1:import() 返回 promise 对象
  • 特点 2:相较于 import 命令,import()可以实现动态加载,其路径可以根据情况改变
  • 特点 3:import()适用在运行阶段,而不是像 import 一样在编译阶段,这意味着 import(),可以使用在 JS 代码中,比如条件判断,函数中等

import()用法

场景 1:按需加载 import()可以在需要的时候,再加载某个模块。vue 中异步组件的使用,也用到了 import()方法

import { createApp, defineAsyncComponent } from 'vue'
createApp({
  // ...
  components: {
    AsyncComponent: defineAsyncComponent(() =>
      import('./components/AsyncComponent.vue')
    )
  }
})

场景 2:条件加载 import()可以放在 if 代码块,根据不同的情况,加载不同的模块。

if (condition) {
  import('moduleA').then(...);
} else {
  import('moduleB').then(...);
}

2. require

requireNode内置的用于加载模块文件函数,require函数可以读取并执行一个JavaScript文件,然后返回该模块的exports对象。
module.exports变量(用于导出模块),require函数(用于导入模块)是CommonJS定义了两个主要概念,module.exports属性表示当前模块对外输出的接口,当其他文件通过require函数加载该模块时实际上就是读取module.exports中的变量。
CommonJS实现了Javascript的模块化规范,规范了模块的特性和各模块之间的相互依赖性,使得代码可以更好的编写和维护,同时提高了代码的复用性。

CommonJS 模块的特点如下:

  • 所有代码运行在模块作用域,不会污染全局作用域
  • 模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。
  • 模块加载的顺序,按照其在代码中出现的顺序
区别importrequire
规范ES6规范CommonJs规范(nodejs)
加载方式编译时加载运行时加载
位置可以实现动态加载,理论上可以放在任何位置用于静态导入,位于文件顶端(不可在条件语句或作用域中使用)
性能import编译时引入模块的属性说以性能稍高require运行时才引入模块的属性所以性能相对较低