打包第三库那些事

2023-11-06

介绍

一般来说,写完一个第三方库需要打包出三个文件夹的文件,对应三种不同模块类型

# outputpath
├── dist  # umd module
├── es    # es module
├── lib   # commonjs module

三个模块类型

umd

  • UMD(Universal Module Definition)是 AMD 和 CommonJS 的糅合,跨平台的解决方案
  • UMD 打包出来的文件可以直接通过 script 插件 html 中使用
  • 我们的代码会被这样一段代码包裹起来
;(function webpackUniversalModuleDefinition(root, factory) {
  if (typeof exports === 'object' && typeof module === 'object')
    module.exports = factory()
  else if (typeof define === 'function' && define.amd) define([], factory)
  else if (typeof exports === 'object') exports['A'] = factory()
  else root['A'] = factory()
})(window, function() {
  //...
})

commonjs

  • CommonJS 模块是对象,是运行时加载,运行时才把模块挂载在 exports 之上(加载整个模块的所有),加载模块其实就是查找对象属性。
  • 导出使用 module.exports,也可以 exports。就是在此对象上挂属性。exports 指向 module.exports,即 exports= module.exports
  • 加载模块通过 require 关键字引用
module.exports.add = function add() {
  return
}
exports.sub = function sub() {
  return
}

const a = require('a.js')

es module

  • ES Module 不是对象,是使用 export 显示指定输出,再通过 import 输入。此法为编译时加载,编译时遇到 import 就会生成一个只读引用。等到运行时就会根据此引用去被加载的模块取值。所以不会加载模块所有方法,仅取所需。
export const m = 1

export {
  m
}

import { m } from 'a.js'

why

  • umd 为了支持使用者通过各种不同的模块类型引用,包括通过 script 使用第三方库
  • commonjs 支持使用者在 commonjs 模块类型下引用,而且可以部分使用第三方库,不会引入整个库
  • es module 支持使用者在 es module 模块类型下引用, 如果使用者需要对第三方库再打包时,webpack、rollup 都对 es module 有特殊的优化,只打包使用到的方法

使用 webpack 打包 umd 模块

如果使用 webpack 来打包 umd 文件,我们应该配置哪些选项

webpack config

const config = {
  entry,
  output: {
    path: './dist',
    libraryTarget: 'umd',
    filename: 'index.min.js',
    library: 'MyLibrary',
    libraryExport: 'default'
  },
  externals: {
    react: {
      root: 'React',
      commonjs2: 'react',
      commonjs: 'react',
      amd: 'react'
    }
  }
}
  • libraryTarget

    指定打包文件的模块类型
  • library

    如果生成的输出文件,是在 HTML 页面中作为一个 script 标签引入,则变量 MyLibrary 将与入口文件的返回值绑定
  • libraryExport

    默认 webpack 会把返回值绑定在 MyLibrary 的 default 属性下, 也就是MyLibrary.default才是我们模块的返回值。通过设置libraryExport: 'default',起到MyLibrary = MyLibrary.default的效果, 不需要再通过 default属性去访问返回值
  • externals

    为了缩小打包文件的体积,对引用到的其他库的文件,应该过滤掉,比如在这里引用到了 react,但实际上我们并不需要把 react 一起打包进去,我们可以通过一些方式来从 node_modules 文件夹中或者全局变量中访问到 react
// webpack 会判断不同的环境,并以不同的方式去访问react
;(function webpackUniversalModuleDefinition(root, factory) {
  if (typeof exports === 'object' && typeof module === 'object')
    module.exports = factory(require('react'))
  else if (typeof define === 'function' && define.amd)
    define(['react'], factory)
  else if (typeof exports === 'object')
    exports['MyLibrary'] = factory(require('react'))
  else root['MyLibrary'] = factory(root['React'])
})

最后再配置一下 babel-loader,就能生成我们期望的 umd 文件了

使用 babel 打包 commonjs 模块

使用 babel 打包就很简单了, 先看一下 babelrc 怎么写

babelrc

{
  presets: [['@babel/env', { loose: true, modules: 'cjs' }], '@babel/preset-react'],
  plugins: [
    ['@babel/plugin-transform-runtime', { useESModules: false }],
  ]
}

loose

一句话解释: true 的时候代码更现代化代码量少,false 更兼容代码量也更多

modules

设置使用不同的模块类型,commonjs 的话,就设置成'cjs'

transform-runtime

babel 会给每个编译的文件插入一些辅助方法,如果文件一多的话,就出现了很多重复代码,这个插件会改为从第三方包引用辅助方法,
需要额外安装@babel/runtime

e.g.

var _interopRequireDefault = require('@babel/runtime/helpers/interopRequireDefault')

build

babel src --out-dir lib

使用 babel 打包 ES Module 模块

只要把上面里所有 module 相关的设置改成 es module 就行了

babelrc

{
  presets: [['@babel/env', { loose: true, modules: false }], '@babel/preset-react'],
  plugins: [
    ['@babel/plugin-transform-runtime', { useESModules: true }],
  ]
}

build

babel src --out-dir es

最后

安利一波个人写的打包库的工具 build-my-package, js, ts都支持哦!:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

打包第三库那些事 的相关文章

  • onclick 调用 hide-div 函数不起作用

    我一直在与这段简单的代码作斗争 我正在尝试使用
  • 如何使对象“a == b”的比较成立? [复制]

    这个问题在这里已经有答案了 这是面试前 JavaScript 在线测试的问题之一 function F var a new F var b new F Q 如何进行比较a b to be true e g console log a b t
  • Google 地图上的自定义路线/路径/道路

    我需要能够使用 V2 或 V3 最好是 3 创建在某种意义上忽略建筑物的路径 我试图创建一个 kml 文件来自己绘制所有路径 然后找到某种方法根据需要打开 关闭它们 例如 用户想要从 A 点前往 B 点 这些点之间有许多建筑物 用户可以实际
  • ExtJS 4 用于选择所选值的组合框事件

    由于某种原因 我需要知道用户何时从组合框中选择了值 即使它已经被选择 仅当用户选择未选择的项目时 选择 事件才起作用 我在组合框或选择器的文档中没有看到任何类似 itemclick 的事件 有任何想法吗 ComboBox uses 绑定列表
  • 将字符串数组转换为对象 Id 数组

    我有一个字符串数组 let stringObjectIdArray fssdlfsd343 43434234242 342424242 我想使用 mongoose 类型将字符串数组更改为对象 Id 数组 但它不起作用 它仅适用于字符串而不是
  • HTML5 游戏到本机应用程序 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在用 HTML5 制作游戏 我最熟悉 HTML5 并且比 C 等更高级的语言更喜欢它 HTML5
  • 如果文本过滤器在 ng-repeat 中没有返回结果,则显示消息

    假设我们有一个带有文本过滤器的 ng repeat
  • 基于 json 文件动态显示选择、复选框、日期选择器等

    对我之前的问题的补充 我根据 json 文件动态显示输入字段 现在我想根据它们的组显示选择项 复选框和日期选择器 我如何解决这个问题 我需要将这些元素推入computeJSON 但写入例如选择options item selection不管
  • 正则表达式没有按预期工作?

    我有这个正则表达式 new RegExp a z 0 9 ig 我正在测试一个不应该工作的字符串 vc 但它确实通过了测试 而且它不应该 new RegExp a z 0 9 ig test vc true 但如果我删除其中一个 or or
  • 如何隐藏 URL 中的 ID

    我以前在 Stack Overflow 上见过这类问题 但没有一个真正有帮助 我也用谷歌搜索过 但没有骰子 我想知道如果用户单击选项卡本身是否可以隐藏 URL 中的 ID 这是网页 www planet nu dev new experia
  • 如何在 Angular 模板中嵌入 GitHub gist?

    角度忽略script其模板中包含标签 但加载 GitHub gist 需要它们 执行此操作的最佳做 法是什么 使用iframe 创造script动态标记 或者是其他东西 一种方法是创建一个iframe with script里面并在你希望你
  • 如何在Android上获取角度中的按键事件?

    我们如何在 Android 上的 Angular 中获取按键事件及其值 我使用phonegap Cordova Angular JS
  • 无法使用 jQuery 添加两个小数

    我试图将两个小数值相加 但返回的总和是纯整数 怎么了 我找不到它 欢迎任何帮助 jQuery delivery method ship select change function var cost jQuery this val jQue
  • 如何禁用向左滚动?

    I got a div 元素 parent 包含多个子元素 item 我想启用滚动父元素一个方向 left OR正确的 否则什么都不会发生 看我的代码 parent scroll function gt gt gt scroll event
  • 在 Jest 测试中设置时刻时区

    我有 util 函数 它以特定的日期格式解析给定的日期 即 2019 01 28 然后使用momentJS检索当天的开始并将其转换为 ISO 日期格式 dates js import moment from moment export co
  • 使用 jQuery animate 时,有没有办法隐藏 webkit 浏览器中显示的工件?

    我正在使用 jQuery animate 在网页上的项目中滑动 由于某种原因 只有在 webkit 浏览器中 元素动画的空间中才会出现伪影痕迹 有没有办法阻止或隐藏这种情况 一旦您加载此处的页面 它们就会出现在轮播上 http www my
  • 在浏览器中打开的 .mhtml 文件中填写输入

    我想对 mhtml 文件运行 e2e 测试 即填写表格 在 mhtml 文件上查看和提取数据效果非常好 但我无法填写任何内容input字段 既不是手动也不是通过木偶操作者 你可以用这个试试 mhtml 文件 https gist githu
  • 为什么发送 fetch() 时我的响应数据未定义?

    我正在尝试在客户端使用 fetch 将数据发布到我的 NodeJS 服务器或从我的 NodeJS 服务器发布数据 服务器很好地收到了 post 请求 我能够记录 req 变量 但是当我 res send any data 时 客户端无法检测
  • ES6 模板文字可以在运行时替换(或重用)吗?

    tl dr 是否可以制作可重用的模板文字 我一直在尝试使用模板文字 但我想我就是不明白 现在我感到沮丧 我的意思是 我想我明白了 但 它 不应该是它的运作方式 或者它应该如何实现 它应该变得不同 我看到的所有示例 甚至标记模板 都要求 替换
  • KML 中的 JavaScript 被 Google 地球插件忽略

    我创建了一个简单的 KML 文件 该文件可以在独立的 Google 地球客户端中运行 但在 Google 地球插件中根本无法运行 无论浏览器如何

随机推荐

  • 入职后发现是超级「屎山」代码,怎么破?网友看不下去了...... 丨黑马头条

    大家好 我是播妞 昨天有位粉丝和我聊天 说他喜欢的一位女生说他是 技术宅 问我这是褒义还是贬义 思考了两秒我回答 如果妹子喜欢你就是褒义 不喜欢你就是贬义 看到文章的各位技术宅们 大家觉得是什么意思呢 又到了每周的黑马头条时间 最近的技术圈
  • 09 线性回归及矩阵运算

    09 线性回归及矩阵运算 线性回归 定义 通过一个或者多个自变量与因变量之间进行建模的回归分析 其中可以为一个或者多个自变量之间的线性组合 一元线性回归 涉及到的变量只有一个 多元线性回归 变量两个或以上 通用公式 h w w0 w1x1
  • kafka生产者幂等与事务

    目录 前言 幂等 事务 总结 参考资料 前言 Kafka 消息交付可靠性保障以及精确处理一次语义的实现 所谓的消息交付可靠性保障 是指 Kafka 对 Producer 和 Consumer 要处理的消息提供什么样的承诺 常见的承诺有以下三
  • 【杨氏矩阵】

    文章目录 前言 一 题目描述 二 题目解析 一 解法1 二分查找 二 解法2 Step wise线性搜索解法 总结 前言 大家好 我是熊猫 今天要和大家一起学习的是在杨氏矩阵中寻找数字的问题 一 题目描述 有一个数字矩阵 矩阵的每行从左到右
  • centos和ubantu安装软件的区别

    序言 安装软件时经常会遇到类似下面这张图 那这些不同的Linux版本有哪些区别 安装软件又应该注意哪些 本文将就以下问题展开讨论 Linux发行版本有哪些 Linux不同版本安装软件的方式和区别 说明 图中FreeBSD Oracle So
  • 小技巧:如何在R语言与excel/word之间进行复制粘贴

    原创 康哥 勤用统计 问 R语言中能进行类似电脑中control C control V的操作吗 现实数据处理过程中 经常需要进行R语言与Excel word等文件的数据传输 笨方法 是直接导出or导入整个文件 答 R语言也可以与Excel
  • [蓝桥杯][算法提高VIP]我们的征途是星辰大海

    题目 题目链接 题解 实现题 这也很基础 写代码的时候细心点就行 代码 include
  • 时序预测

    时序预测 MATLAB实现PSO BP时间序列预测 粒子群优化BP神经网络时间序列预测 多指标评价 目录 时序预测 MATLAB实现PSO BP时间序列预测 粒子群优化BP神经网络时间序列预测 多指标评价 效果一览 基本介绍 程序设计 参考
  • 动态路由协议

    动态路由协议 在各台路由器上 激活同一种协议后 路由器间沟通计算获取未知路由信息 最终生成路由表实现全网可达 静态协议的缺点 1 在中大型网络中配置量大 2 不能实时收敛 不能基于拓扑的变化而变化 动态协议的优点 1 在中大型的配置量较静态
  • CRM-统计分析--线索统计--新增线索数量折线图(接口实现)

    统计分析 线索统计 新增线索数量折线图 需求 统计出一段时间内的每一天 新增的线索数量 通过每天新增的线索数量和线索总数量 分析线上线下活动的执行情况 难度级别 B级 接口名 report salesStatistics 请求方式 get请
  • 个人免签支付云端监听免挂机支付宝收款

    GOGO支付 打不开了 貌似liangle 然后自己根据原理实现了一套 方案用来替代 gogo支付收款 云端监听免挂机 支付宝采用抓包技术云端调用官方接口 获取收款信息 监听效率非常高 而且很稳定 GOGO支付个人免签支付系统实现原理说明
  • 让flexmojos modulefiles支持通配符文件集,模块输出不带版本号且按包结构输出

    jar包下载 http download csdn net source 1879817 1 从http svn sonatype org flexmojos tags flexmojos 3 2 0 check out 源码 2 修改fl
  • 《Attention Is All You Need》

    论文地址 https arxiv org abs 1706 03762 谷歌于2017年发布论文 Attention Is All You Need 提出了一个只基于attention的结构来处理序列模型相关的问题 比如机器翻译 相比传统的
  • 什么是Base64

    一 什么是Base64 百度百科中对Base64有一个很好的解释 Base64是网络上最常见的用于传输8Bit字节码的编码方式之一 Base64就是一种基于64个可打印字符来表示二进制数据的方法 什么是 可打印字符 呢 为什么要用它来传输8
  • logback mdc日志跟踪

    1 简介 MDC Mapped Diagnostic Context 映射调试上下文 是 log4j logback及log4j2 提供的一种方便在多线程条件下记录日志的功能 MDC 可以看成是一个与当前线程绑定的哈希表 可以往其中添加键值
  • 图象恢复——(逆滤波,维纳滤波)

    目的 对获取图像在频域用高斯函数进行退化并叠加白噪声 对退化图像进行逆滤波和维纳滤波恢复 比较原始图像和恢复图像 对利用逆滤波和维纳滤波恢复方法恢复图像进行比较 一 基本原理 图像复原是一种客观的操作 通过使用退化现象的先验知识重建或恢复一
  • Windows上Kafka运行环境安装

    1 安装JDK 1 1 安装文件 http www oracle com technetwork java javase downloads index html 下载JDK 1 2 安装完成后需要添加以下的环境变量 右键点击 我的电脑 g
  • Daily Scrum: 2012/11/12

    由于我们是从10月31日开始进行Daily Scrum的 所以我们的Daily Scrum时间段为10 31 11 12共10天 包括一天周六 成员 角色 今天工作 明天计划 王安然 PM Dev 完成了EnermyCraft抽象类 并进行
  • 毕业设计-基于深度学习的命名实体识别研究

    目录 目录 前言 课题背景和意义 实现技术思路 一 命名实体识别简单概述 二 基于深度学习的命名实体识别方法 实现结果 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精
  • 打包第三库那些事

    介绍 一般来说 写完一个第三方库需要打包出三个文件夹的文件 对应三种不同模块类型 outputpath dist umd module es es module lib commonjs module 三个模块类型 umd UMD Univ