百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

JavaScript 中 require 和 import 语句的区别

myzbx 2024-12-03 16:39 24 浏览

随着现代 Web 开发,我们要么使用 require 要么使用 import 引用 JavaScript 依赖项。有时,我们将两者结合使用。

但是,你知道为什么这两者都存在吗? 使用一种或另一种时的最佳实践是什么?

在本文中,我将讨论使用 require 和 import 并回答其中一些常见问题。

背景——JavaScript 模块类型

在讨论 require 和 import 之前,有必要对 JavaScript 模块有一定的了解。 那么,让我们看看有哪些不同类型的 JavaScript 模块可用。

1. AMD——异步模块定义

引入了 AMD 模块以使模块更加前端友好。 它们不需要任何打包器,并且所有依赖项都是动态解析的。

AMD使用 require 函数用于加载外部模块,并且能够充当 CommonJS 模块的包装器。

define("exampleModule", [], () => {
   return {
     print: () => console.log("Hello World!");
   }
}
define("main", ["require", "exampleModule"], (require) => {
  const exampleModule= require("exampleModule");
  exampleModule.print(); 
});

但是,随着 ES 模块的引入,AMD 的使用量急剧减少。

2. CommonJS 模块

CommonJS 是 NodeJS 用来在模块中封装 JavaScript 的标准。 module.exports用于导出 CommonJS 模块,以及 import 函数用于将模块包含到单独的文件中。

尽管 CommonJS 模块在 NodeJS 中被广泛使用,但在前端开发中并没有使用它们。 这背后的主要原因是require函数的同步行为。

但是,NodeJS 从 v13 开始才开始支持 ES 模块。 在那之前,大多数 NodeJS 模块,包括 NPM 库,都是使用 CommonJS 模块开发的。

因此,CommonJS 模块仍然在开发人员中广泛使用。

而且,CommonJS 模块与 ES 模块同样重要,我将在本文接下来的部分中讨论更多。

3.UMD——通用模块定义

UMD 是 AMD 和 CommonJS 的组合。 它使用了 AMD 的 CommonJS 语法和异步加载技术,使其适用于服务器端和客户端。

UMD 在 Webpack 等打包器中用作回退模块,下面显示了一个简单的 UMD 模块示例:

(function (root, factory) {
        if (typeof define === "function" && define.amd) {
            define(["jquery"], factory); // AMD } else if (typeof exports === "object" ) { module.exports = factory(require("jquery")); //CommonJS } else { root.returnExports = factory(root.jQuery); } 
        })(this, function ($) {
        function exampleFunction() {}
        return exampleFunction;
    });

4. ESM — ES 模块

ES Modules (ECMAScript Modules) 是 JavaScript 中使用的官方标准。 ES 模块使用 import和 export 处理模块的语句。 它解决了 CommonJS 的最大限制之一,即同步加载。

在引入 ES Modules 之后,开发者之间有很多争论,考虑到与 CommonJS 的兼容性。 但是,开发人员已经适应使用这两种方法,我们将在接下来的部分中讨论更多详细信息。

已经了解了 JavaScript 模块的背景,那么让我们继续讨论 require 和 import.

“Require” 是 NodeJS 内置的

require通常与 NodeJS 一起使用来读取和执行 CommonJS 模块。

这些模块可以是内置模块,如 http或自定义编写的模块。 使用 require,可以将它们包含在 JavaScript 文件中并使用它们的函数和变量。

// 内置模块 
const http= require('http'); 
// 本地模块 
const getBlogName = require('./blogDetails.js') 

但是,如果要使用 require 要获取本地模块,首先需要使用 module.exports 导出它们.

例如,假设您有一个名为 blogDetails.js,并且您需要使用该文件中的函数 index.js文件。

// blogDetails.js
const getBlogTitle = (name, author) => {
    return name + " by " + author;
 }
 modules.export = getBlogTitle;
// index.js
const getBlogTitle = require('./blogDetails.js');

var title = getBlogTitle ('Require vs Import in JavaScript', 'Chameera Dulanga');

还可以使用一次导出多个模块 modules.export 如下:

const getBlogTitle = (name, author) => { 
   return name + " by " + author;
}
const getBlogContent = () => { 
   return content
}
modules.export = {
  getBlogTitle,
  getBlogContent,
};

注意: 如果最后不是使用 modules.export,可以附加 exports 。 例如: exports.getBlogContent = () => {};

我想现在你明白什么时候应该使用 require以及它是如何工作的。 接下来让我们看看如何 import 。 然后我们将能够以更深层次的理解来比较和对比它们。

“import”是在 ES6 模块中引入的

import 是一个 ES 模块,并带有 export,它们被称为 ES6 import 和 export.

我们不能用 import 或导出到 ES 模块之外。

试图 import ES 模块之外是一个常见的开发人员错误。

如果我举同样的例子,我需要做的唯一改变就是修改 modules.export到 export default.

const getBlogTitle = (name, author) => { 
   return name + " by " + author;
}

export default getBlogTitle;

然后我们可以使用 import 将此文件包含在我们的 index.js文件。

import getBlogTitle from "./blogDetails.js";

var title = getBlogTitle ('Require vs Import in JavaScript', 'Chameera Dulanga');

注意: 类似于 require,还可以通过将导出附加到每个函数定义来单独导出每个函数。

例如: export const = getBlogContent = () => {};

所以,我想你现在明白应该如何以及何时使用 require和 import。但是,这还不是全部; 它们的功能和用法存在一些显着差异。 是时候进行比较了。

require Vs import

require 和 import 都用于包含模块。 但是它们有几个应该注意的重要功能。

1. require 语句可以在代码的任何地方调用

import 语句只能在文件的开头定义。 定义一个 import 其他地方的语句会给你一个错误或自动转移到文件的开头。

2. require 可以有条件地调用

声明 require 时,当加载的模块名称未预定义时,允许有条件地或动态地加载模块。

例如,你可以调用 require 在函数或 if 条件中,如下所示:

if(articleCount>0){
   const getBlogTitle = require(‘./blogDetails.js’);
}

require语句具有这种灵活性,因为它们被视为函数。 它们在运行时被调用,在此之前没有办法知道任何事情。 但, import 语句是静态的,我们不能有条件地或动态地使用它们。

注意: 由于 import 语句是静态的,所以可以在运行应用程序之前检测到任何错误

3. import 语句是异步的

在小型应用程序中,同步或异步可能不会发挥主要作用。 但是,如果我们考虑大型应用程序,则会使用数百个模块。 所以,如果你使用 require, 模块将被一 一加载和处理。

而 import 语句通过异步工作解决了这个问题,这比 require 在大规模应用中更能发挥作用。

4. ES 模块是未来

正如我们所讨论的,ES 模块系统是作为维护客户端 JavaScript 模块的标准引入的。 TypeScript 也采用了它,并添加了用于定义 Type 的内容。 因此,我不认为 require可以再次取代 ES,因为它已成为开发人员中广泛使用的标准。

但是由于有大量的 NodeJS 模块和库是用 CommonJS 编写的,我们不能保留 require完全放在一边。 所以我们必须相应地使用它们。

如果你使用的是 TypeScript,则可以通过配置 tsconfig.json文件。 例如,假设我们需要输出一个使用 CommonJS 的代码版本。

需要做的就是创建一个新的 tsconfig 通过扩展原始文件用于 CommonJS 输出 tsconfig文件并修改 module下参数 CompilerOptions.

{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "module": "CommonJS",
    "outDir": "./lib/cjs"
  },
}

注意: 还可以使用 Webpack 等构建工具将 ES 模块转换为 CommonJS 模块。

以下表格为比较两者

特征

require

import

语法

const x=require()

import x from './'

模块

CommonJS

ES

异步

不支持

支持

条件(if)

支持

不支持

Node

支持

V13+

TypeScript

支持

支持

相关推荐

Django零基础速成指南:快速打造带用户系统的博客平台

#python##服务器##API##编程##学习#不是所有教程都值得你花时间!这篇实战指南将用5分钟带你解锁Django核心技能,手把手教你从零搭建一个具备用户注册登录、文章管理功能的完整...

iOS 17.0 Bootstrap 1.2.9 半越狱来啦!更新两点

这款Bootstrap半越狱工具终于更新,离上一次更新已相隔很久,现在推出1.2.9版本,主要为内置两点功能进行更新,也是提升半越狱的稳定性。如果你正在使用这款半越狱工具的,建议你更新。注意!...

iOS 16.x Bootstrap 1.2.3 发布,支持运行清理工具

本文主要讲Bootstrap半越狱工具更新相关内容。如果你是iOS16.0至16.6.1和17.0系统的,想体验半越狱的果粉,请继续往下看。--知识点科普--Bootstrap...

SpringBoot整合工作流引擎Acticiti系统,适用于ERP、OA系统

今日推荐:SpringBoot整合工作流引擎Acticiti的源码推荐理由:1、SpringBoot整合工作流引擎Acticiti系统2、实现了三级权限结构3、持久层使用了mybatis框架4、流程包...

SpringCloud自定义Bootstrap配置指南

在SpringCloud中自定义Bootstrap配置需要以下步骤,以确保在应用启动的早期阶段加载自定义配置:1.添加依赖(针对新版本SpringCloud)从SpringCloud2020...

Python使用Dash开发网页应用(三)(python网页开发教程)

PlotlyDash开发Web应用示例一个好的网页设计通常都需要编写css甚至js来定制前端内容,例如非常流行的bootstrap框架。我们既然想使用Dash来搭建web应用,很大的一个原因是不熟悉...

Oxygen XML Editor 27.1 中的新功能

OxygenXMLEditor27.1版是面向内容作者、开发者、合作者和出版商的行业领先工具包的增量版本。在27.1版本中,AIPositronAssistant得到了增强,包括用于...

【LLM-多模态】Mini-Gemini:挖掘多模态视觉语言模型的潜力

一、结论写在前面论文提出了Mini-Gemini,一个精简而强大的多模态VLM框架。Mini-Gemini的本质在于通过战略性框架设计、丰富的数据质量和扩展的功能范围,发掘VLM的潜在能力。其核心是补...

谐云课堂 | 一文详解分布式改造理论与实战

01微服务与分布式什么是分布式?首先,我们对上图提到的部分关键词进行讲解。单体,是指一个进程完成全部的后端处理;水平拆分,是同一个后端多环境部署,他们都处理相同的内容,使用反向代理来均衡负载,这种也叫...

基于Abaqus的手动挡换挡机构可靠性仿真

手动挡,也称手动变速器,英文全称为Manualtransmission,简称MT,即用手拨动换挡操纵总成才能改变变速器内的齿轮啮合位置,改变传动比,从而达到变速的目的。家用轿车主要采用软轴连接的换挡...

【pytorch】目标检测:彻底搞懂YOLOv5详解

YOLOv5是GlennJocher等人研发,它是Ultralytics公司的开源项目。YOLOv5根据参数量分为了n、s、m、l、x五种类型,其参数量依次上升,当然了其效果也是越来越好。从2020...

超实用!50个非常实用的PS快捷键命令大全分享

今天,给大家介绍50个非常实用的快捷键命令大全,大家伙都是设计师,关于软件使用那是越快越好啊。一、常用的热键组合1、图层混合模式快捷键:正常(Shift+Option+N),正片叠底(Shif...

Pohtoshop中深藏不露的小技巧(科目一考试技巧记忆口诀看完必过)

邢帅教育ps教程为大家总结了一些Pohtoshop中深藏不露的小技巧,可以帮助到大家在设计时减少不必要的麻烦,提高工作效率哦~~~1.设置网格线保持像素完美不在1:1分辨率下也能保持像素完美,可以...

Ganglia监控安装总结(监控安装工作总结)

一、ganglia简介:Ganglia是一个跨平台可扩展的,高性能计算系统下的分布式监控系统,如集群和网格。它是基于分层设计,它使用广泛的技术,如XML数据代表,便携数据传输,RRDtool用于数据...

谁说Adobe XD做不出好看的设计?那是你没搞懂这些功能

AdobeXD的美化栏具有将设计视图美化的功能,它能使界面设计和原型设计更漂亮、更吸引眼球。美化栏的7个功能包括竖线布局设计、横线布局设计、重复网格、图形大小和位置设置、响应式调整大小、文字美化以及...