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日

相关推荐

  • flex布局详解

    往往在移动端开发过程中,弹性布局是非常实用的一种手段。往往你并不需要去反复的使用媒体查询的。整整的响应式布局是使界面能够自动的根据屏幕进行变化,做到完美的弹性布局,在必要的时候,去…

    2018年9月10日
    2.3K
  • JavaScript 事件委托详解

    基本概念 事件委托,通俗地来讲,就是把一个元素响应事件(click、keydown……)的函数委托到另一个元素; 一般来讲,会把一个或者一组元素的事件委托到…

    2021年3月8日
    1.2K
  • 创建JavaScript对象的六种方式

    第一种:Object 构造函数创建 这行代码创建了 Object 引用类型的一个新实例,然后把实例保存在变量 Person 中。 第二种:使用对象字面量表示法 对象字面量是对象定义…

    2020年6月24日
    1.4K
  • Java自学之类与对象

    定义 类是由成员属性和方法组成。成员属性主要定义类的一个具体信息,实际上一个成员属性就是一个变量,而方法是一些操作的行为。类的定义基础语法如下。 一个类定义完成后并不能够被直接使用…

    2020年11月25日
    1.4K
  • JAVA学习之多线程知识点整理

    1、什么是进程?什么是线程? 进程是一个应用程序。线程是一个进程中的执行场景或者执行单元。一个进程可以启动多个线程。进程之间内存独立不共享。同一个进程中的线程之间,堆内存和方法区内…

    2020年6月19日
    1.4K
  • Webpack入门,模块打包之CommonJS简介

    CommonJS 说到前端的模块,不得不讲一下CommonJS。CommonJS是由JavaScript社区于2009年提出的包含模块、文件、IO、控制台在内的一系列标准。Node…

    2022年11月10日
    619
  • JAVA学习路线之夯实基础

    第一章 开发环境 JDK(Java SE Development Kit),Java标准版开发包,提供编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行环…

    2020年1月14日
    1.7K
  • Webpack入门,资源处理流程

    在前几篇的文章中,梳理了Webpack的模块打包功能。可以把Webpack打包模块理解成类似于工厂中的产品组装,也就是把一个个零部件拼起来得到最终的成品。接下来的几篇,则主要要关注…

    2022年11月18日
    716
  • Webpack入门,项目工程配置说明

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

    2022年11月9日
    548
  • Vue项目中实现用户登录及token验证

    在前后端完全分离的情况下,Vue项目中实现token验证大致思路如下: 第一次登录的时候,前端调后端的登陆接口,发送用户名和密码 。 后端收到请求,验证用户名和密码,验证成功,就给…

    2019年8月8日
    5.2K