谈谈webpack对npm模块导入的解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 问题描述 在一次运营后台的常规更新时,发现有一个外部依赖包不能正常工作。经排查发现,react-split-pane在前几天发了一个新版0.1.81,该版本同时提供commonjs和es module两种包导入方式:   原来我们采用的CMD写法 const ReactSplitPane = require('react-split-pane') 失效了。 

问题描述

在一次运营后台的常规更新时,发现有一个外部依赖包不能正常工作。经排查发现,react-split-pane在前几天发了一个新版0.1.81,该版本同时提供commonjses module两种包导入方式:
 
原来我们采用的CMD写法 const ReactSplitPane = require('react-split-pane') 失效了。 
 

原因分析

 
翻查webpack官方文档后,发现webpack会对包导入会进行解析,不管是采用CMD方式还是ES6 import方式。 解析的依据是配文件的 resolve.mainFields 属性, 该属性用于配置采用package.json的哪个字段作为模块的入口文件。
 
以react-split-pane 模块为例,当 resolve.mainFields = ['browser', 'module', 'main'] 时 , webpack在解析 如 const ReactSplitPane = require('react-split-pane')
import ReactSplitPane from 'react-split-pane' 的时候,会优先使用 dist/index.esm.js 。 由于采用
export default 导出的模块必须使用 import x from 'xx' 的方式(或 使用 const x = require('x').default的方式) 导入, 否则导入后的模块会引用不正确.
 
如果 resolve.mainFiels 没有显式指定,则根据webpack的 target 的取值来决定其默认值
 
  • 当 target的值为 webworkerweb 或者没有指定时,mainFields = ['browser', 'module', 'main']
  • 当 target 为其他任意值(包括node), mainFields = ['module', 'main']
 

后续

 
随着ES6的普及,相信会有越来越多的第三方模块提供 es module 版本,而mainFields的默认值中, module 总是排在 main之前 ,因此类似的问题还会发生。要从根本上解决这个问题,有以下的办法
 
  • 借助 js-codemod等工具,将所有对第三方模块的导入方式 从commonjs 方式改成 ES6 import方式。 因为采用module.exports= .. 导出的包均可以使用import x from '...' 的方式导入,但export default x 导出的包不能直接用require('x')导入.
  • 显式指定mainFields , 把main的优先级提高 或干脆不使用es module。但这种做法无法利用webpack提供的tree shaking 能力减少构建后bundle的体积, 也无法用上一些浏览器已支持的es6特性
  • 利用npm shrinkwrap锁定包版本,缺点是无法及时享受依赖bugfix更新
目录
相关文章
|
7月前
|
机器学习/深度学习 存储 Python
|
7月前
|
网络协议
阿里云DNS常见问题之DNS导入解析报错如何解决
阿里云DNS(Domain Name System)服务是一个高可用和可扩展的云端DNS服务,用于将域名转换为IP地址,从而让用户能够通过域名访问云端资源。以下是一些关于阿里云DNS服务的常见问题合集:
|
2月前
|
SQL 关系型数据库 MySQL
数据库导入SQL文件:全面解析与操作指南
在数据库管理中,将SQL文件导入数据库是一个常见且重要的操作。无论是迁移数据、恢复备份,还是测试和开发环境搭建,掌握如何正确导入SQL文件都至关重要。本文将详细介绍数据库导入SQL文件的全过程,包括准备工作、操作步骤以及常见问题解决方案,旨在为数据库管理员和开发者提供全面的操作指南。一、准备工作在导
278 0
|
2月前
|
缓存 前端开发 JavaScript
Webpack技术深度解析:模块打包与性能优化
【10月更文挑战第13天】Webpack技术深度解析:模块打包与性能优化
|
4月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
186 6
|
4月前
|
缓存 前端开发 JavaScript
Webpack 模块解析:打包原理、构造形式、扣代码补参数和全局导出
Webpack 模块解析:打包原理、构造形式、扣代码补参数和全局导出
152 1
|
4月前
|
JSON 数据格式
【Axure高手秘籍】掌握这招,让你的原型设计效率飙升!——元件库导入与使用教程及主流资源下载全解析
【8月更文挑战第20天】Axure RP是界面设计与交互原型制作的强大工具。掌握元件库能显著提升设计效率。元件库包含预设UI元素如按钮、表单等,可直接拖放构建布局。在Axure RP中,通过“元件”选项下的“库”可访问并导入新元件库。导入后,轻松拖放元件至画布调整,甚至自定义样式和交互。利用脚本还能模拟真实交互效果,如按钮点击反馈。推荐资源包括Axure Marketplace、UIZilla等,助力高效设计。
87 0
|
JavaScript 前端开发 数据库
前端常见知识点汇总(ES6,Vue,axios,Node.js,npm,webpack)-3
前端常见知识点汇总(ES6,Vue,axios,Node.js,npm,webpack)
104 0
|
7月前
|
存储 数据处理 数据格式
Python中导入Excel数据:全面解析与实践
Python中导入Excel数据:全面解析与实践
286 0

推荐镜像

更多
下一篇
无影云桌面