【Webpack】加载其他型模块

非模块化文件
非模块化文件指的是并不遵循任何一种模块标准的文件。
最常见的就是在 script标签引用jQuey及其各种插件

如何使用 Webpack打包这类文件呢? 其实只要直接引人即可,如:

import './jquery.min.js';

但假如我们引人的非模块化文件是以隐式全局变量声明的方式暴露其接口的,则会发生问题,如:

// 通过在顶层作用城声明交量的方式暴露接口
var calculator = {// ...
}

由于 Webpack在打包时会为每一个文件包装一层函数作用域来避免全局污染,上面的代码无法把calculator对象挂载全局,因此这种以隐式全局变量生命需要额外注意

AMD
AMD是英文Asynchronous Module Definition (异步模块定义)的缩写,从名字就可以看到和CommonJS和ES6 Module最大的区别在于它加模块的方式是异步的。下面就是一个例子

define('getsum' , ['calculator'], function(math) (return function(a, b) {console.log('sum:'+ calculator.add(a,b));}
});

在AMD中使用define 函数来定义模块,它可以接受3个参数。
第1个参数是当前模块的id,相当于模块名;
第2个参数是当前模块的依赖,比如上面我们定义的getSum模块需要引人calculator模块作为依赖;
第3个参数用来描述模块的导出值,可以是函数或对象。如果是函数则导出的是函数的返回值;如果是对象则直接导出对象本身。

和CommonJS类似,AMD也使用require函数来加载模块,只不过采用异步的形式。

require(['getSum'], function(getSum)(getSum(23);
}):

require的第1个参数指定了加载的模块
第2个参数是当加载完成后执行的回调函数

通过AMD这种形式定义模块的好处在于其模块加载是非阻塞性的,当执行到require 函数时并不会停下来去执行被加载的模块,而是继续执行require后面的代码这使得模块加载操作并不会阻塞浏览器。

尽管AMD的设计理念很好,但与同步加载的模块标准相比其语法要更加冗长。另外其异步加载的方式并不如同步显得清晰,并且容易造成回调地狱(callback hell)。在目前的实际应用中已经用得越来越少

UMD

严格来说,UMD并不能说是一种模块标准,不如说它是一组模块形式的集合。
UMD的全称是 Universal Module Definition,也就是通用模块标准,它的目标是一个模块能运行在各种环境下,不论是CommonJS、AMD,还是非块化的环境(当时ES6Module还未被提出)。
看下面的例子:

// calculator.js
(function(global, main){//根据当前环境采取不同的导出方式if(typeof define === 'function' && define.amd){// AMDdefine(...)} else if (typeof exports === 'object'){//ComnonJSmodule.exports = ...;}else{//非模块化环境global.add = ...}
}(this, function(){// 定义模块主体return {...}
}));

可以看出,UMD其实就是根据当前全局对象中的值判断目前处于哪种模块环当前环境是AMD,就以AMD的形式导出。

需要注意的问题是,UMD 模块一般都最先判断AMD环境,也就是全局下是define函数,而通过AMD定义的模块是无法使用CommonJS 或ES6 Module的形式确引人的。

在 Webpack中,由于它同时支持AMD及CommonJS,也许工程中的所有块都是 CommonJS,而UMD 标准却发现当前有AMD环境,并使用了AMD方式导这会使得模块导人时出错。当需要这样做时,我们可以更改UMD模块中判断的顺使其以CommonS的形式导出即可

加载npm模块
npm平台上已经有几十万个模块(pakage,也可称之为包),并且这个数字每天都在增加,各种主流的框架类库都可以在npm平台上找到。作为开发者,每个人也都可以自己封装模块并上传到npm,通过这种方式来与他人共享代码。

那么如何从我们的本地工程安装和加载一个外部的npm模块呢?首先我们需要初始化一个npm工程,并通过npm来获取模块。下面以lodash这个库为例:

#项目初始化
npm init -y
#安装1odash
npm install lodash

执行了上面的命令之后,npm会将lodash安装在工程的node_modules目录下,并将对该模块的依赖信息记录在 package.json中

在使用时,加载一个npm模块的方式很简单,只需要引人包的名字即可

// index.js
import _ from 'lodaeh';

当Webpack在打包时解析到这条语句,就会自动去node _modules中寻找名为lodash的模块了,而不需要我们写出从源文件index.js到node_modules中lodaeh的路径。

现在知道,在导人一个nm模块时,只要写明它的名字就可以了。那么在实际打包的过程中具体加载的是npm模块中哪个JS文件呢?

每一个npm模块都有一个人口。当我们加载一个模块时,实际上就是加载该的人口文件。这个人口被维护在模块内部package.json文件的main字段中。

比如对于前面的lodash 模块来说,它的 package.json 内容如下:

//./node_modules/underscore/package.json
{"name":"lodash",..."main":"lodash.js"
}

当加载该模块时,实际上加载的是 node_modules/lodash/lodash.js。

除了直接加载模块以外,我们也可以通过<package_name>/<path>的形式单独加载模块内部的某个JS文件。如:

import all from 'lodash/fp/all.js';
console.log('all',all);

这样,Webpack最终只会打包node_modules/lodash/fp/all.js 这个文件,而不会打包全部的lodash库,通过这种方式可以减小打包资源的体积。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/591190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mongodb启动失败

● mongodb.service - High-performance, schema-free document-oriented database Loaded: loaded (/etc/systemd/system/mongodb.service; disabled; vendor preset: disabled) Active: inactive (dead) 1月 02 10:18:10 lcy mongod[7013]: ERROR: child process fail…

EDI 项目推进流程

EDI 需求确认 交易伙伴发来EDI对接邀请&#xff0c;企业应该如何应对&#xff1f; 首先需要确认EDI需求&#xff0c;通常包括传输协议和报文标准以及传输的业务单据类型。可以向交易伙伴发送以下内容&#xff1a; &#xff08;中文版&#xff09; 与贵司建立EDI连接需要使用…

软件黑盒测试

软件黑盒测试是一种测试方法&#xff0c;它不考虑被测试的软件的内部结构和代码&#xff0c;只关注输入和输出。黑盒测试的目的是验证软件是否符合规格说明书、用户需求和功能规范等要求。通常&#xff0c;黑盒测试包括以下几个步骤&#xff1a; 确定测试目标&#xff1a;确定测…

【温故而知新】vue组件间通信的实现方式

概念 Vue组件间通信的实现方式有以下几种: 父子组件通信:父组件可以通过props属性将数据传递给子组件,子组件可以通过$emit方法触发父组件定义的事件。子组件访问根组件:可以使用provide/inject来实现子组件访问根组件的数据。兄弟组件通信:可以通过一个共同的父组件作为…

【没有哪个港口是永远的停留~论文解读】stable diffusion

了解整个流程&#xff1a; 【第一部分】输入图像 x &#xff08;W*H*3的RGB图像&#xff09;【第一部分】x 经过编码器 生成 (latent 空间的表示) h*w*c (具体设置多少有实验)【第二部分】 逐步加噪得到 &#xff0c;和噪声标签【第二部分】由 Unet&#xff08; &#xff…

Kubernetes(k8s):Namespace详解

Kubernetes&#xff08;k8s&#xff09;&#xff1a;Namespace详解 一、Namespace简介1.1 什么是Namespace1.2 Namespace的作用1.3 命名空间的分类 二、创建和管理Namespace2.1 创建Namespace2.2 管理Namespace 三、Namespace的实战应用3.1 部署多个项目3.2 环境隔离3.3 资源配…

从零开始配置kali2023环境:配置jupyter的多内核环境

在kali2023上面尝试用anaconda3&#xff0c;anaconda2安装实现配置jupyter的多内核环境时出现各种问题&#xff0c;现在可以通过镜像方式解决 1. 搜索镜像 ┌──(holyeyes㉿kali2023)-[~] └─$ sudo docker search anaconda ┌──(holyeyes㉿kali2023)-[~] └─$ sudo …

C++初阶——权限与继承

目录 一、C权限方面的问题 1.访问权限 2.继承机制 二、Cconst引用 const引用有以下几个特点 临时对象引用 常量引用成员变量 二、c引用空间相关问题 三.auto 一、C权限方面的问题 【C入门】访问权限管控和继承机制详解_权限继承功能-CSDN博客文章浏览阅读840次。(2)但…

uniapp-H5项目的坑

先推荐个插件库-非常好用&#xff1a;https://ext.dcloud.net.cn/ 一、uniapp h5 适配pc端 1、问题&#xff1a;屏幕尺寸在400px~960px之间页面排版错乱 2、解决方法&#xff1a;在page.json文件中 "globalStyle": {"navigationStyle": "custom&quo…

YOLOv8训练自己的数据集(超详细)

一、准备深度学习环境 本人的笔记本电脑系统是&#xff1a;Windows10 YOLO系列最新版本的YOLOv8已经发布了&#xff0c;详细介绍可以参考我前面写的博客&#xff0c;目前ultralytics已经发布了部分代码以及说明&#xff0c;可以在github上下载YOLOv8代码&#xff0c;代码文件夹…

LVM和磁盘配额

一&#xff1a;LVM概述&#xff1a; LVM 是 Logical Volume Manager 的简称&#xff0c;译为中文就是逻辑卷管理。 能够在保持现有数据不变的情况下&#xff0c;动态调整磁盘容量&#xff0c;从而提高磁盘管理的灵活性 /boot 分区用于存放引导文件&#xff0c;不能基于LVM创建…

MongoDB vs MySQL:项目选择哪一个数据库系统?

由于市场上有各种可用的数据库&#xff0c;用户经常会就MongoDB与MySQL进行辩论&#xff0c;以找出更好的选择。 使用MySQL等关系数据库的组织在根据不断变化的需求管理和存储数据时可能会面临一定的困难。同时&#xff0c;新公司想知道选择什么数据库&#xff0c;这样他们就不…

【ArcGIS微课1000例】0085:甘肃省白银市平川区4.9级地震震中位置图件制作

据中国地震台网正式测定,12月31日22时27分在甘肃白银市平川区发生4.9级地震,震源深度10公里,震中位于北纬36.74度,东经105.00度。 文章目录 一、白银市行政区划图1. 县级行政区2. 乡镇行政区二、4.9级地震图件制作1. 震中位置2. 影像图3. 震中三维地形一、白银市行政区划图…

【LLM 】7个基本的NLP模型,为ML应用程序赋能

在上一篇文章中&#xff0c;我们已经解释了什么是NLP及其在现实世界中的应用。在这篇文章中&#xff0c;我们将继续介绍NLP应用程序中使用的一些主要深度学习模型。 BERT 来自变压器的双向编码器表示&#xff08;BERT&#xff09;由Jacob Devlin在2018年的论文《BERT:用于语言…

数据结构初阶之栈和队列(C语言版)

数据结构初阶之栈和队列&#xff08;C语言版&#xff09; ✍栈♈栈的结构设计♈栈的各个接口的实现&#x1f47a;StackInit(初始化)&#x1f47a;push&#xff08;入栈&#xff09;&#x1f47a;pop&#xff08;出栈&#xff09;&#x1f47a;获取栈顶元素&#x1f47a;获取栈中…

软件工程期末总结

软件工程期末总结 软件危机出现的原因软件生命周期软件生命周期的概念生命周期的各个阶段 软件开发模型极限编程 可行性研究与项目开发计划需求分析结构化分析的方法结构化分析的图形工具软件设计的原则用户界面设计结构化软件设计面向对象面向对象建模 软件危机出现的原因 忽视…

7.13N皇后(LC51-H)

算法&#xff1a; N皇后是回溯的经典题 画树&#xff1a; 假设N3 皇后们的约束条件&#xff1a; 不能同行不能同列不能同斜线 回溯三部曲&#xff1a; 1.确定函数参数和返回值 返回值&#xff1a;void 参数&#xff1a; int n&#xff1a;题目给出&#xff0c;N皇后的…

骨传导蓝牙耳机什么牌子好用?为你揭晓不踩雷的骨传导耳机排行

喜欢运动的朋友们&#xff0c;你们一定不能错过骨传导耳机&#xff01;它真的是我们运动时的好帮手。为什么这么说呢&#xff1f;因为它不会像普通耳机那样塞住我们的耳朵&#xff0c;让我们在运动时感觉不舒服&#xff0c;甚至伤害耳朵。而且&#xff0c;它还可以帮助我们听到…

QT+OSG/osgEarth编译之六十七:dds+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_dds)

Qt+OSG/osgEarth跨平台编译(用Qt Creator组装各个库,实现一套代码、一套框架,跨平台编译)_qt + osgearth安装-CSDN博客 目录 1、dds介绍 2、文件分析 3、pro文件 4、编译实践 <

go 使用 sync.RWMutex

使用 sync.RWMutex 简介使用注意点 简介 简述读写锁的使用&#xff0c;以及注意点 使用 在读操作的时候 加读锁&#xff0c; 在写操作的时候加写锁&#xff0c; 举例: 多个协程需要读取、写入的操作 // 读操作 func reader(id int) {for {rwMutex.RLock()fmt.Printf("R…