谈谈import和require的区别

6,554 阅读2分钟

粗鄙苟谈,欢迎评论区指正

import和require都是node编程中最重要的思想就是模块化的体现。

历史

最开始的开端js发明出来就是为了在浏览器上做个动效,做个表单提交,定义为浏览器应用程序的语言,但之后由Mozilla工程师Kevin Dangoor于2009年1月开始构建的CommonJS出现了,CommonJS API定义很多普通应用程序(主要指非浏览器的应用)使用的API,目标是在浏览器外部为JavaScript指定生态系统。

随着2009年有个叫Ryan Dahl创造了node.js项目,Node.js允许通过JavaScript和一系列模块来编写服务器端应用和网络相关的应用。Node.js已经有数十万模块,它们可以通过一个名为npm的管理器免费下载。

而NODE和NPM都是遵循CommonJS规范(做了一些取舍,填了一些新东西)应运而生的。

import和require

前面讲了很多历史,很迷糊,而且与本文要讲的并没有啥相关性。

别着急,少年。

之前说了node编程中的模块系统是基于CommonJS规范的,在CommonJS中,有一个全局性方法require(),用于加载模块。比如node编程里要加入一个HTTP模块,如下:

const http = require('http')
exports.http = http
module.exports = http

而import用于加载模块就比较多样了

import http from 'http'
import {default as http} from 'http'
import * as http from 'http'
import {get} from 'http'
import {getList as get} from 'http'
import http, {getList} from 'fs'

export default http
export const http
export function getList
export {getList, get}
export * from 'http'

区别

命令 规范 调用 本质 特点
require CommonJS规范 运行时调用 赋值过程 非语言层面的标准。 社区方案,提供了服务器/浏览器的模块加载方案。只能在运行时确定模块的依赖关系及输入/输出的变量,无法进行静态优化。
import es6+的语法标准 编译时调用 解构过程 语言规格层面支持模块功能。支持编译时静态分析,便于JS引入宏和类型检验。动态绑定

关于规范

import是es6的一个语法标准,如果要兼容浏览器的话必须转化成es5的语法。

关于调用

  1. require的引用可以在代码的任何地方。
  2. import语法规范上是放在文件开头。

关于本质

  1. require的结果就是对象、数字、字符串、函数等,再把require的结果赋值给某个变量
  2. 目前所有的引擎都还没有实现import,我们在node中使用babel支持ES6,也仅仅是将ES6转码为ES5再执行,import语法会被转码为require