2019独角兽企业重金招聘Python工程师标准>>>

背景

随着组件化、模块化意识地不断增强,越来越多同学开始构建npm包来供业务复用了。今天收到一位同学的反馈,问题是构建出的package在使用时,会抛出ReactDOM找不到的异常,后来通过查看构建出的源码,结合webpack打包原理,找到了解决方案。

案发现场

首先,我们回顾一下案发现场。

Can't resolve 'ReactDOM' in xxxx

我们继续勘察,打开构建好的文件,源码头部如下所示:

(function webpackUniversalModuleDefinition(root, factory) {if(typeof exports === 'object' && typeof module === 'object')module.exports = factory(require("React"));else if(typeof define === 'function' && define.amd)define("module", ["React"], factory);else if(typeof exports === 'object')exports["module"] = factory(require("React"));elseroot["module"] = factory(root["React"]);
})

我们能够看到,头部的脚本已经是umd格式化后的了,表明其可以在BrowserAMDCommonJS环境下均可以使用,并且观察到ReactreactDOM依赖是直接引用进来的,说明打包时的externals的确是设置过的,而且设置很有可能如下:

{'react':'React','react-dom':'ReactDOM'
}

打包格式和资源抽离已经做好,为什么还会出错呢?仔细观察错误,webpack报错ReactDOM依赖找不到,我们尝试将其引用的代码迁移到项目里,编写如下:

const ReactDOM = require('ReactDOM');

但是在真实业务代码里,require的不是ReactDOM,而是react-dom,只是在构建的时候,将设置为externals里的依赖进行替换而已。

解决方案

恍然大悟,我们意识到在CommonJS下引入的依赖名应该为react-dom,而非浏览器环境下注入在全局变量里的ReactDOM,:故只需要想方设法将打包好的文件头部里对CommonJS环境下的依赖名进行修改为react-dom即可。

深入理解externals

聪明的webpack早已经帮我们想好了这点,接下来我们通过深入externals参数来解决此问题。

我们通常情况下配置的externals参数为字符串格式,其表达的意思为在全局变量里查找此变量,例如如下配置代表使用window.jQuery

{jquery:'jQuery'
}

为了支持不同环境下,使用不同的依赖,externals提供了object格式的配置,例如如下配置表名了在全局变量环境下使用ReactDOM变量,在其他环境下使用react-dom对象

转载于:https://my.oschina.net/u/3611008/blog/1840756

Webpack构建library时的踩坑经历相关推荐

  1. springCloud项目不能向EurekaServer 注册多个EurekaClient时(端口不一致)方法及踩坑经历

    spring cloud 问题说明:springCloud项目不能向EurekaServer 注册多个EurekaClient时(端口不一致)方法及踩坑经历: 前提--->已经能够通过Eurek ...

  2. 【golang程序包推荐分享】分享亿点点golang json操作及myJsonMarshal程序包开发的踩坑经历 :)

    目录[阅读时间:约5分钟] 一.概述 1.Json的作用 2.Go官方 encoding/json 包 3. golang json的主要操作 二.Json Marshal:将数据编码成json字符串 ...

  3. GPCC安装以及踩坑经历

    gpcc安装以及踩坑经历 官方下载地址文档 https://network.pivotal.io/products/pivotal-gpdb#/releases/29190 安装开始之前 chown ...

  4. 一次kvm嵌套虚拟化踩坑经历

    女主宣言 嵌套虚拟化就是虚拟化环境里再次进行虚拟化,简单的说就是虚拟机里运行虚拟机,听起来有点递归的感觉.那是不是可以无限嵌套下去呢?递归有终结条件,否则无限递归下去资源耗尽,嵌套虚拟化嵌套层次越深复 ...

  5. 记一次成功把Vue2后台项目改造成Vite2的踩坑经历

    文章目录 前言 一.项目背景 1.1.为什么要选择Vite 二.迁移前的准备 2.1.补全.vue后缀 2.2.移动public/index.html的位置 2.2.1.通过vite-plugin-h ...

  6. uniapp 引入阿里矢量图标库的详细步骤及踩坑经历

    uniapp 引入阿里矢量图标库的详细步骤及踩坑经历 首先在阿里矢量图标库选择自己喜欢的图标 加购物车如下图 点击右上角的购物车 添加到项目 这里有坑 首先你不选中在线链接 你是看不到 @font-f ...

  7. yolov5-4.0环境搭建,零基础小白都能看得懂的教程。YOLOv5搭建的最快搭建方式,踩坑经历详谈)yolov5/yolov4/yolov3/yolov3通>>>>>>>>>>>>>>>>>第一章

    第一章:python最新YOLOv5-4.0环境搭建,零基础小白都能看得懂的教程.YOLOv5搭建的最快搭建方式,踩坑经历详谈 环境准备: yolov5-4.0环境搭建整体说明 2,anaconda的 ...

  8. 从零开始搞起 Disney BRDF源码编译(含踩坑经历)

    前情背景资料: 项目在Github上的源码地址:BRDF 1. 读官网的readme介绍 readme 里介绍了编译方式: How to compile BRDF Explorer for Windo ...

  9. 记一次uniapp的踩坑经历

    前言 这几天在做一个app,打比赛用,使用的是uni+uView的组件库.这个组件库是半道加进来的,学弟推荐的,我看有组件的话确实会方便很多,而且他都是按需引入,不占用额外空间,挺好的,我也就直接拿来 ...

最新文章

  1. Ubuntu 17 安装sublime
  2. 机器人动力学建模实例(二):三连杆机械臂
  3. python 安装 pip,setuptools
  4. java 文件 字符串_java将字符串写入到txt文件中
  5. 程序员面试100题之十六:二叉树中两个节点的最近公共父节点
  6. 博弈论 斯坦福game theory stanford week 3.2_
  7. 搜索算法(一)--DFS/BFS求解拯救同伴问题(JAVA)
  8. windows server 2008 + IIS 7.5实现多用户FTP(多账号对应不同目录)
  9. ASP、JSP、PHP 三种技术比较
  10. html5文字收起,科技常识:HTML5给汉字加拼音收起展开组件的实现代码
  11. 程序员真实写真:35岁前成功的12条黄金法则 (转)
  12. PyTorch学习—17.正则化之weight_decay与dropout
  13. fortan dll在本地可以运行成功,移植到其他电脑上报错Exception in thread main java.lang.UnsatisfiedLinkError: 找不到指定的模块。
  14. 「安妮股份」拉上小米做版权联盟
  15. 易支付平台全网大汇总!总有一款适合你!
  16. Css中路径data:image/png;base64的用法详解与操作
  17. 私活利器:Java企业级快速开发框架——若依 前后端分离版本编译
  18. 微信公众号支付|微信H5支付|微信扫码支付|小程序支付|APP微信支付解决方案总结
  19. pyttsx3 快速上手之:语音合成播报
  20. 【看这个篇就够了】95%成为网络安全工程师

热门文章

  1. 已开源!谷歌将AutoML应用到Transformer架构,实现机器翻译最佳性能
  2. 多功能PCIE交换机之三:PCIE非透明桥 cache一致性
  3. WCF技术剖析之三十二:一步步创建一个完整的分布式事务应用
  4. java生成自己定义的表ID
  5. 解释性的语言vs编译性语言
  6. 自定义listview
  7. 关于self.用法的一些总结
  8. 黄聪:ICTCLAS分词系统研究(一)(转)
  9. J2ME游戏引擎程序结构
  10. android开发 修改标题栏背景_基于.NET的APP开发方式中MobileForm的使用smobiler