Webpack入门,模块打包之加载其他类型的模块

在实际开发中,开发者可能遇到其他类型的模块,比如AMD、UMD模块,虽然这些模块在目前的使用场景已经不多,但是遇到这些模块时仍然需要知道如何处理。

加载非模块化的文件

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

如何使用Webpack打包这类文件呢?其实只需要直接引入即可:import './jquery.min.js';这句代码会直接执行jquery.min.js。一般来说,jQuery这类库都是将其接口绑定在全局,因此无论是从script标签引入,还是使用Webpack打包的方式引入,其最终效果是一样的。

加载AMD模块

AMD(Asynchronous Module Definition,异步模块定义)是由JavaScript社区提出的专注于支持浏览器端模块化的标准。从名字就可以看出它与CommonJS和ES6 Module最大的区别在于它加载模块的方式是异步的。

在AMD中使用define函数来定义模块,它可以接收3个参数。第一个参数是当前模块的ID【可选】,相当于模块名;第二个参数是当前模块的依赖【可选,亦可为空】;第三个参数用来描述模块的导出值,可以是函数或对象。如果是函数则导出的是函数的返回值;如果是对象则直接导出对象本身。

// example.js
define([], function () {
  return {
    sayHello: function () {
      console.log("hello world!");
    },
  };
});

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

define(["./example.js"], function (example) {
  example();
});

require的第一个参数指定了加载的模块,第二个参数是当加载完成后执行的回调函数。

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

尽管AMD的设计理念很好,但与同步加载的模块标准相比其语法要更加冗长。另外其异步加载的方式没有同步加载的方式清晰,并且容易造成回调地狱(callback hell)。

加载UMD模块

严格来说,UMD并不是一种模块标准,而是一组模块形式的集合。UMD的全称是Universal Module Definition,也就是通用模块标准,它的目标是使一个模块能运行在各种环境下。

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

可以看出,UMD其实就是根据当前全局对象的值判断目前处于哪种模块环境,就选择适合模块环境的导出方式进行导出。

加载npm模块

与Java、C++、Python等语言相比,JavaScript是一种缺乏标准库的语言。当开发者需要解决URL处理、日期解析这类很常见的问题时,很多时候只能自己动手封装工具接口。而npm提供了这样一种方式,可以让开发者在其平台上找到由他人所开发和发布的库并安装到项目中,从而快速地解决问题。

那么如何在本地工程中加载一个外部的npm模块呢?以实际开发中最常见的lodash库为例。

  1. 首先通过命令将lodash库安装到本地工程中:npm install lodash -save
  2. 然后在全局作用域(一般是工程入口文件)引入lodash库即可:import _ from "lodash"

提示

因为lodash是工具库,在工程运行时也需用到其提供的方法,所以要将lodash库安装到运行依赖中。

示例代码仓库

https://gitee.com/zero_79152105/webpack-vblog

原创文章,作者:ZERO,如若转载,请注明出处:https://www.edu24.cn/course/webpack-load-other-modlue.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
ZEROZERO
上一篇 2022年11月12日
下一篇 2022年11月14日

相关推荐

  • MySQL数据库基础之视图及触发器相关知识点整理

    视图的操作 视图,本质上是一种虚拟表,其内容与真实的表相似,包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值形式存在。行和列数据来自自定义视图的查询所引用基本…

    2020年7月13日
    1.6K
  • JAVA基础知识整理

    终于下定决心2020年转JAVA开发,自学之路坎坷曲折。俗话说的话,好记性不如烂笔头。如果有小伙伴们也像我一样在JAVA自学之路上徘徊,那就关注一下我的博客网站。我会不定期更新一下…

    2020年1月11日
    1.9K
  • Java自学之继承

    在面向对象的设计过程中,类是基本的逻辑单位。但是对于这些基本的逻辑单位需要考虑到重用的设计问题,所以在面向对象的设计里提供有继承,并利用这一特点实现类的可重用性定义。 类继承定义 …

    2020年12月3日
    1.6K
  • windows下使用Docker Desktop安装nacos与mysql,实现互通访问

    1、命令行拉取MySQL镜像 打开命令提示符,运行以下命令安装mysql 2、运行mysql镜像,启动mysql实例 3、命令行拉取nacos镜像 4、运行nacos镜像,启动na…

    2022年10月27日
    614
  • Webpack入门,项目工程配置说明

    使用npm scripts 在《Webpack入门,打包第一个工程》文章讲到,webpack打包工程命令为 npx webpack –entry=./index.js –mod…

    2022年11月9日
    631
  • 一维数组结构数据转换树形结构数据JS方法

    在写小程序项目时,自定义了一个组织机构树形展示组件,后端接口返回的组织机构数据是一维数组。需要在前端转换成树形结构的数据,并且添加一些节点的树形,比如是否为叶子节点,节点是否展开等…

    2022年11月10日
    625
  • Java自学之数组

    在Java中数组是一组相关变量的集合,属于引用数据类型。 定义 数组引用传递分析 数组属于引用数据类型,在数组使用时需要通过关键字new开辟堆内存空间,一块堆内存空间也可以同时被多…

    2020年11月26日
    1.5K
  • spring boot练习篇之用户登录系统【接口篇】

    写在前面 抛弃JSP,只做纯粹的前后端分离项目。 作为一个资深前端工作者,想要转JavaWeb开发,无论是书籍,还是网上视频、资料,竟然没有一篇能清楚明白地讲解怎样搭建一个前后端分…

    2021年5月25日
    1.8K
  • Java自学之I/O编程

    I/O(Input/Output,输入/输出)可以实现数据的读取与写入操作,Java针对I/O操作的实现提供了java.io工具包,此包的核心组成由File类、InputStrea…

    2020年12月21日
    1.4K
  • 两栏布局之左侧固定,右侧自适应的实现方法

    实现左侧固定,右侧自适应的两栏布局的方法有很多。其中经常用到的有float方法、BFC方法、CSS3的flex布局及grid布局。并非所有的布局都会在开发中使用,但是其中也会涉及一些知识点。

    2018年10月13日
    2.8K