require,import区别?

遵循的模块化规范不同

模块化规范:即为 JavaScript 提供一种模块编写、模块依赖和模块运行的方案。谁让最初的 JavaScript 是那么的裸奔呢——全局变量就是它的模块化规范。前端

require/exports 出生在野生规范当中,什么叫作野生规范?即这些规范是 JavaScript 社区中的开发者本身草拟的规则,获得了你们的认可或者普遍的应用。好比 CommonJS、AMD、CMD 等等。import/export 则是名门正派。TC39 制定的新的 ECMAScript 版本,即 ES6(ES2015)中包含进来。

出现的时间不一样

require/exports 相关的规范因为野生性质,在 2010 年先后出生。AMD、CMD 相对命比较短,到 2014 年基本上就风雨飘摇了。一开始你们还比较喜欢在浏览器上采用这种异步小模块的加载方式,但并非银弹。随着 Node.js 流行和 Browsersify 的兴起,运行时异步加载逐渐被构建时模块合并分块所替代。Wrapper 函数不再须要了。 2014 年 Webpack 仍是新玩意,如今已是前端必备神器了。

Browsersify、Webpack 一开始的目的就是打包 CommonJS 模块。
 
CommonJS 做为 Node.js 的规范,一直沿用至今。因为 npm 上 CommonJS 的类库众多,以及 CommonJS 和 ES6 之间的差别,Node.js 没法直接兼容 ES6。因此现阶段 require/exports 任然是必要且实必须的。出自 ES6 的 import/export 相对就晚了许多。被你们所熟知和使用也是 2015 年以后的事了。 这其实要感谢 babel(原来项目名叫作 6to5,后改名为 babel) 这个神通常的项目。因为有了 babel 将还未被宿主环境(各浏览器、Node.js)直接支持的 ES6 Module 编译为 ES5 的 CommonJS —— 也就是 require/exports 这种写法 —— Webpack 插上 babel-loader 这个翅膀才开始高飞,你们也才能够称 " 我在使用 ES6! "

这也就是为何前面说 require/exports 是必要且必须的。由于事实是,目前你编写的 import/export 最终都是编译为 require/exports 来执行的。
相关文章
相关标签/搜索