zoukankan      html  css  js  c++  java
  • require和import的区别

    1、require 和 import 的区别

    node编程中最重要的思想就是模块化,import 和 require 都是被模块化所使用。在 ES6 当中,用 export 导出接口,用 import 引入模块。但是在 node 模块中,使用module.exports导出接口,使用 require 引入模块。

    两者的区别如下:

    遵循规范:

    • require 是 AMD 规范引入方式
    • import是 ES6 的一个语法标准,如果要兼容浏览器的话必须转化成 ES5 的语法

    调用时间:

    • require是运行时调用,所以require理论上可以运用在代码的任何地方
    • import是编译时调用,所以必须放在文件开头

    本质:

    • require 是赋值过程。module.exports后面的内容是什么,require的结果就是什么,比如对象、数字、字符串、函数等,然后再把require的结果赋值给某个变量,它相当于module.exports的传送门
    • import 是解构过程,但是目前所有的引擎都还没有实现import,我们在node中使用babel支持ES6,也仅仅是将ES6转码为ES5再执行,import语法会被转码为require

    就目前来说,所有的引擎都还没有实现import,我们在node中使用babel支持ES6,也仅仅是将ES6转码为ES5再执行,import语法会被转码为require。这也是为什么在模块导出时使用module.exports,在引入模块时使用import仍然起效,因为本质上,import会被转码为require去执行。

    2、require() | exports 的用法

    通过require引入基础数据类型时,属于复制该变量。通过require引入复杂数据类型时,属于浅拷贝该对象。

    2.1、导入模块 require() 的用法

    require() 函数用于在当前模块中加载别的模块。在函数内写入模块的路径即可(相对路径和绝对路径都行)

    var foo1 = require('./foo');   // .js 扩展名可忽略
    var foo2 = require('./foo.js');
    
    var data = require('./data.json');  //不仅仅是 JS 文件,也可以是其他文件

    require 相当于module.exports的传送门,module.exports后面的内容是什么,require的结果就是什么,比如对象、数字、字符串、函数等,然后再把require的结果赋值给某个变量。

    require理论上可以运用在代码的任何地方,甚至不需要赋值给某个变量之后再使用,比如:

    require('./a')();                //假设a模块是一个函数,此时将立即执行a模块函数
    var data = require('./a').data;  //假设a模块导出的是一个对象
    var a = require('./a')[0];      //假设a模块导出的是一个数组

    2.2、输出接口 exports 的用法

    exports 对象是当前模块的导出对象,用于导出该模块的方法或属性。

    别的模块通过 require() 函数引用别的模块时实际上得到的就是别的模块的 exports 对象:

    exports.hello = function () {
        console.log('Hello World!');
    };

    导出模块的方法或者属性可以直接用 exports,也可以使用 module.exports 来进行导出。通过module对象可以访问到当前模块的一些相关信息,但最多的用途是替换当前模块的导出对象。

    module.exports = function () {
        console.log('Hello World!');
    };

    实际上,exports是module.exports的一个引用,module.exports 指向的就是 exports。

    console.log(exports === module.exports);   //输出true

    3、import | export 的用法

     import 是编译时运行的(require是运行时的),它必须放在文件开头,而且使用格式也是确定的,不容置疑。它不会将整个模块运行后赋值给某个变量,而是只选择import的接口进行编译,这样在性能上比require好很多。

    import | export 遵循 ES6 规范,支持编译时静态分析,便于JS引入宏和类型检验。动态绑定。写法比较多:

    import fs from 'fs'
    import {default as fs} from 'fs'
    import * as fs from 'fs'
    import {readFile} from 'fs'
    import {readFile as read} from 'fs'
    import fs, {readFile} from 'fs'
    
    export default fs
    export const fs
    export function readFile
    export {readFile, read}
    export * from 'fs'

    具体可参考:https://www.cnblogs.com/wenxuehai/p/11312851.html#_label1_1

  • 相关阅读:
    【持续更新】Android 源码下载地点
    android Notification 的使用
    如何设置 Notification 中PendingIntent 的 Intent
    CodeSmith部分类型转换代码
    【转】Request.ServerVariables参考
    ADT
    根据IP从纯真IP数据库查询地址
    VS2008重置默认环境
    Eclipse 安装SVN插件
    C#序列化JSON对象
  • 原文地址:https://www.cnblogs.com/wenxuehai/p/14246989.html
Copyright © 2011-2022 走看看