require 与 import 两种引入模块方式到底有什么区别?

关于JavaScript 的模块化规范,可以移步至: 【JavaScript高级】模块化规范「一文让你彻底搞懂前端模块化规范 & 区别」

下面进入正题

requireimport 两种引入模块方式,到底有什么区别呢?

大致可以分为以下几个方面:

一、写法上
  • require/exports 的用法:

    const path = require('path')
    exports.path = path
    module.exports = path
    
  • import/export 的用法:

    import path from 'path'
    import {default as path} from 'path'
    import * as path from 'path'
    import { dirname } from 'path'
    import { dirname as dir } from 'path'
    import path, {dirname} from 'path'
    
    export default path
    export const path
    export function dirname
    export {dirname}
    export * from 'path'
    
二、执行顺序
  • require:不具有提升效果,到底加载哪一个模块,只有运行时才知道。

    const path = './' + fileName;
    const myModual = require(path);
    
  • import:具有提升效果,会提升到整个模块的头部,首先执行。

    // import 的执行早于foo的调用。本质就是 import 命令是编译阶段执行的,在代码运行之前。
    
    foo();
    
    import { foo } from 'my_module';
    
三、输入值的区别
  • require 输入的变量,基本类型数据是赋值,引用类型为浅拷贝,可修改。

  • import 输入的变量都是只读的,如果输入 a 是一个对象,允许改写对象属性。

    // a.js
    let obj = {
      foo() {
        console.log('obj...foo');
      }
    }
    export {
      obj
    }
    
    // b.js
    import { obj } from '/a.js'
    
    // 非法操作
    obj = {}; // Syntax Error : 'a' is read-only; 
    // Uncaught TypeError: Assignment to constant variable.
    
    // 合法操作
    obj.foo = 'hello'; 
    
四、是否可以使用表达式或变量
  • require:可以使用表达式和变量

    let a = require('./a.js')
    a.add()
    
    let b = require('./b.js')
    b.getSum()
    
  • import:静态执行,不能使用表达式和变量,因为这些都是只有在运行时才能得到结果的语法结构。

    // 报错
    import { 'f' + 'oo' } from 'my_module';
    
    // 报错
    let module = 'my_module';
    import { foo } from module;
    
    // 报错
    if (x === 1) {
      import { foo } from 'module1';
    } else {
      import { foo } from 'module2';
    }
    

总结

require/exportsimport/export 本质上的区别,实际上也就是 CommonJS 规范与 ES Module 的区别。

  1. 浏览器在不做任何处理时,默认是不支持 importrequire
  2. babel 会将 ES6 模块规范转化成 CommonJS 规范;
  3. webpackgulp 以及其他构建工具会对 CommonJS 进行处理,使之支持浏览器环境
    它们有三个重大差异。
    • CommonJS 模块输出的是一个值的拷贝,ES Module 输出的是值的引用。
    • CommonJS 模块是运行时加载,ES Module 是编译时输出接口。

      导致该差异是因为 CommonJS 加载的是一个对象(即 module.exports 属性),该对象只有在脚本运行完才会生成。而 ES Module 不是对象,它的对外接口只是一种静态定义,在代码静态解析阶段就会生成。

    • CommonJS 模块的 require() 是同步加载模块,ES Module 的 import 命令是异步加载,有一个独立的模块依赖的解析阶段。

关于 CommonJS 规范与 ES Module 的区别,大家可以移步至: 【JavaScript高级】模块化规范「一文让你彻底搞懂前端模块化规范 & 区别」 进行阅读。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,要使用第三方库,需要先将库文件添加到项目中。美团Java SDK也不例外,需要先下载SDK的jar包,再将其添加到项目中。 下载SDK的jar包可以在美团开发者中心的“文档中心”页面下载,选择对应的Java版本下载即可。 将SDK的jar包添加到项目中,有两种方式: 1. 在IDE中添加依赖。在Maven或Gradle等构建工具中,可以在pom.xml或build.gradle等文件中添加SDK的依赖,构建项目时自动下载并加入到项目中。例如,在Maven中,可以添加以下依赖: ```xml <dependency> <groupId>com.meituan.ocean</groupId> <artifactId>meituan-ocean-sdk-java</artifactId> <version>1.0.0</version> </dependency> ``` 2. 手动添加jar包。将SDK的jar包复制到项目的lib目录下,并在IDE中添加到项目的依赖中。具体步骤如下: - 在IDE中右键点击项目,选择“Open Module Settings”(或“Project Structure”),进入“Project Settings”页面; - 在左侧选择“Libraries”,点击右上角的“+”号,选择“Java”; - 在弹出的对话框中选择SDK的jar包所在的目录,将其添加到项目中。 添加完SDK的jar包后,就可以在Java代码中使用美团提供的类和方法,例如: ```java import com.meituan.api.ocean.thrift.*; import com.meituan.api.ocean.thrift.auth.*; import com.meituan.api.ocean.thrift.order.*; public class MeituanOrderDemo { // ... } ``` 其中,`com.meituan.api.ocean.thrift`是SDK中的根包名,`auth`和`order`是SDK中的两个子包。在代码中使用了SDK中的OAuth2Client类和OrderClient类等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值