美文网首页
import和require的区别

import和require的区别

作者: codingQi | 来源:发表于2019-08-21 18:13 被阅读0次

共同点:

都是为了实现js代码的模块化,只是两种不同的方式而已。

问:

那为什么会出现两种方案呢,又有什么不同呢?

清楚几种模块化的方案:

  • 野生规范:require/exports
    (1)requirejs遵循AMD;
    (2)seajs遵循CMD;
    (3)node的module遵循CommonJs。
  • 名门正派:import/export
    (1)TC39制定的新的ECMAScript版本,即在ES6(ES2015)中包含进来。
    虽然写法上有所不同,但都是为了能够间接实现模块化,保持较为一致的代码风格。

官方标准定义的模块化方案

即:import、export。
可是,标准毕竟是标准,各大浏览器和node终端要实现标准还是有一段距离的。目前都2018年了,各大主浏览器都还没实现,还得依赖转换工具(例如babel)将代码转为ES5之后浏览器才能解析。
所以这也就解释了为什么我们的工程化代码中nodeJS遵循的commonjs规范和ES6的模块化方案并存的现象。

两者的区别

  • import是ES6标准中的模块化解决方案,require是node中遵循CommonJS规范的模块化解决方案。
  • 后者支持动态引入,也就是require(${path}/xx.js),前者目前不支持,但是已有提案。
  • 前者是关键词,后者不是。
  • 前者是编译时加载,必须放在模块顶部,在性能上比后者好一些;后者是运行时加载,理论来说放在哪里都可以。
  • 前者采用的是实时绑定方式,即导入和导出的值都指向同一个内存地址,所以导入的值会随着导出值变化;而后者在导出时是指拷贝,就算导出的值变化了,导入的值也不会变化,如果想要更新导入的值,就要重新导入。
  • 前者会编译成require/exports来执行。

一、 import的用法

  • import导入模块
    import { a } from 'test.js';
    import * as test from 'test.js';
    import { a as key, b as value } from 'test.js';
  • import导出模块
    export {}
    export default {}
    export default XX - (导出一个类)

(1)命名导出(每个模块包含任意数量)

// test.js

var a = 'aaa';
var b = 'bbb';
var c = 'ccc';
export {
    a,
    b,
    c
};
// demo.js

import test from './test';
console.log('===test===:', test); // ===test===: undefined


import { a } from './test.js';
console.log('===test===:', a); // ===test===: aaa


import * as test from './test';
console.log('===test===:', test); // ===test===: {a: "aaa", b: "bbb", c: "ccc", __esModule: true}
// 导出的test为一个module{},所有内容,截图链接:https://img.haomeiwen.com/i3098902/114f164d0eb3ed4f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240


import { a as key, b as value } from './test';
console.log('===test===:', key + '-----' + value); // ===test===: aaa-----bbb

(2)默认导出(每个模块包含一个)

// test.js

var a = 'aaa';
var b = 'bbb';
var c = 'ccc';
var d = 'ddd';
export default {
    a,
    b,
    c,
    dd: d // 需要自定义属性名的,只能使用`export default`来导出,export {}不可以,会报错。
};
// demo.js

import test from './test';
// 实际上这个default就是一个语法糖,只不过default是es6的一个关键字。
// 等同于
import { default as test } from './test';
console.log('===test===:', test); // ===test===: {a: "aaa", b: "bbb", c: "ccc", dd: "ddd"}


import { a } from './test.js';
console.log('===test===:', a); // ===test===: undefined


import * as test from './test';
console.log('===test===:', test); // ===test===: {default: {…}, __esModule: true}
// 导出的test为一个module{},所有内容,截图链接:https://img.haomeiwen.com/i3098902/5054c2ed429bb7ab.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240


import { a as key, b as value } from './test';
console.log('===test===:', key + '-----' + value); // ===test===: undefined-----undefined

(3)模块重定向
在当前模块中,导出指定导入模块的默认导出(等于是创建了一个“重定向”)。

// test.js

let test1 = {
    a: 1
}
const test2 = (x, y) => {
    return x + y
}
export {
    test1
}
export default test2;
// 重点:体现了重定向  module.js
// 这两种是重定向的标准写法

// 将export {} 原封不动导出去
export * from './test'; // 适用于 导出方式为export {}

// 导出出去的没有default属性,相当于导出的直接是default的值。
export { default } from './test'; // 适用于 导出方式为 export default xx;
// 页面引用 demo.js

import test2, { test1 } from './module';

console.log('test1', test1); // {a: 1}
console.log('test2', test2) // ƒ test2(x, y) { return x + y; }

二、require

  • require导入模块
    const test = require('./test.js');
  • require导出模块
    module.exports = {}
    exports.xx = xx

(1)require导入模块就没那么复杂了,导出时是什么样,导入时就还是什么样:

// test.js

var a = 'aaa';
var b = 'bbb';
var c = 'ccc';
module.exports = {
    a,
    b,
    c
};
// demo.js

const test = require('./test');
console.log('===test===:', test); // ===test===: {a: "aaa", b: "bbb", c: "ccc"}

// 当然,也可以这样导入解析,不需要babel也可以正确运行
const { c } = require('./test');
console.log('===test===:', c); // ===test===: ccc

(2)直接导出 - 不常用的方式

// test.js

var a = 'aaa';
var b = 'bbb';
var c = 'ccc';
exports.c = c;
// demo.js

const test = require('./test');
console.log('===test===:', test); // ===test===: {c: "ccc"}

// 同上面,也可以以这样导入
const { c } = require('./test');
console.log('===test===:', c); // ===test===: ccc

ok,将两者终于进行比较并做了笔记,后面就容易查阅和理解了,所列出来的情况都有进行代码演示,完全真实。。后面有补充的话会进行更新喔。。。

相关文章

  • require,import ,export default,m

    module.exports和exports区别 import和require的区别 import和require...

  • 2、require 和 import 的区别?

    【转载出处】 require 和 import 的区别? 谈谈import和require的区别 1⃣️、遵循的规...

  • require和import区别

    使用形式不一样 import 还有一个重要的区别import是解析时候加载的,require是运行时加载,requ...

  • import和require区别

    在学习过程发现项目代码中存在两种引入方式,便各方查了两种的区别(一下内容为自我学习笔记,如有不当还请指教): 1、...

  • import 和 require区别

    ES6之前出现了JS模块加载的法案,最主要是CommonJS和AMD规范。CommonJS前者主要应用于服务器,实...

  • require和import区别

    遵循的模块化规范不一样 模块化规范:即为 JavaScript 提供一种模块编写、模块依赖和模块运行的方案。谁让最...

  • import 和 require区别

    import和require分别是不同模块化规范下引入模块的语句。 1.时间 年份出处require/exprot...

  • require和import区别

    node编程中最重要的思想就是模块化,import和require都是被模块化所使用。 遵循规范–require ...

  • import和require的区别

  • import和require的区别

    node编程中最重要的思想就是模块化,import和require都是被模块化所使用。 遵循规范 require...

网友评论

      本文标题:import和require的区别

      本文链接:https://www.haomeiwen.com/subject/lbwbsctx.html