JavaScript 中 ES Modules 怎么在打包时排除特定模块

梦磊君_5580

梦磊君_5580

2026-09-20

157人浏览

原创

es modules 本身不支持运行时排除模块,排除需在打包器配置层实现:webpack 用 externals 排除内置模块;vite/webpack 用 define 配合 dce 编译期剔除;通过 sideeffects 标注和 tree shaking 删除未用代码;rollup/vite 可用别名重定向至空模块。

javascript 中 es modules 怎么在打包时排除特定模块

在使用 Webpack、Vite 或 Rollup 等打包工具时,ES Modules(ESM)本身不提供运行时“排除模块”的能力,排除动作实际发生在打包器的配置层,而非 JavaScript 语法层面。关键是要让打包器在构建过程中跳过某些模块的解析、打包或生成代码——常见场景包括避免打包 Node.js 内置模块(如 fspath)、第三方库中的非浏览器兼容代码,或按环境条件剔除调试/监控模块。

通过打包器配置 externals 排除(适用于 Webpack)

Webpack 的 externals 配置可将指定模块标记为“外部依赖”,即不将其打包进最终 bundle,而是在运行时从外部环境(如全局变量、CommonJS 模块、CDN)中获取。

  • 若你用 import { readFileSync } from 'fs',但目标是浏览器环境,可这样排除:
webpack.config.js
module.exports = {
  // ...
  externals: {
    fs: 'commonjs fs',     // 保留 require('fs'),但不打包
    path: 'commonjs path',
    crypto: 'commonjs crypto'
  }
};
  • 对 ESM 形式导入(如 import * as fs from 'fs')同样生效,Webpack 会自动适配模块系统。
  • 注意:若运行环境真没有 fs(比如浏览器),需确保代码逻辑不会执行到该分支,否则会报错。

用 define / replace 实现编译期条件剔除(通用且推荐)

更安全的方式是借助打包器的预定义常量(如 Vite 的 define、Webpack 的 DefinePlugin),配合 if (false) 或死代码消除(DCE)自动移除整个模块导入和调用。

  • Vite 示例(vite.config.ts):
vite.config.ts
export default defineConfig({
  define: {
    '__DEVTOOLS__': JSON.stringify(false),
  },
})

源码中写:

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载
if (__DEVTOOLS__) {
  import('devtools-hook').then(hook => hook.install())
}
  • 打包时,if (false) { ... } 被识别为不可达代码,Tree Shaking 会彻底删除该 import() 动态导入及其后续逻辑。
  • 静态 import 同样适用:if (false) { import './debugger.js' } 不合法,但可改用动态导入 + 条件包裹。

借助 Tree Shaking 和无副作用标注精准控制

ES Modules 天然支持 Tree Shaking,但前提是模块被正确标记为“无副作用”(sideEffects: false),否则打包器不敢删除未显式使用的导入。

  • package.json 中声明:
"sideEffects": false
  • 或仅列出有副作用的文件:"sideEffects": ["*.css", "index.js"]
  • 如果你自己写的工具模块(如 utils/log.js)只导出纯函数,且没修改全局状态或触发 I/O,就应设为无副作用——这样即使写了 import { log } from './utils/log.js' 却没调用 log,它也会被完全剔除。
  • 第三方库若未正确声明 sideEffects,可手动在 Webpack 中覆盖:
module.exports = {
  resolve: {
    alias: {
      'some-heavy-lib': path.resolve(__dirname, 'shims/some-heavy-lib-stub.js')
    }
  }
}

然后在 stub 文件里只导出空对象或轻量替代实现。

按环境或构建命令动态切换模块路径(Rollup/Vite 常用)

利用打包器的插件或别名机制,在构建时将特定导入重定向到空模块或 mock 版本。

  • Vite 别名示例:
vite.config.ts
resolve: {
  alias: {
    '@analytics/tracker': '/src/shims/analytics-stub.ts',
  }
}

其中 analytics-stub.ts 可能只导出空函数:

export const track = () => {}
export const identify = () => {}
  • 这样既保持类型和调用兼容,又彻底排除了原始分析 SDK 的代码体积和副作用。
  • 适合 A/B 测试、灰度发布、或不同客户版本间功能裁剪。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

javascript java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

4106

5

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

2023.07.04

1049

3

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

2023.07.04

3984

6

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

820

4

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

1716

5

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

2023.09.04

3005

4

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

2023.09.12

3913

6

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

2023.09.20

2480

5

java访问控制修饰符介绍
java访问控制修饰符介绍

java访问控制修饰符有四种,分别是public、protected、private、默认访问修饰符。详细介绍:1、public,public是最宽松的访问控制修饰符,被修饰的类、方法和变量可以被任何其他类访问,当一个类、方法或变量被声明为public时,它们可以在任何地方被访问,无论是同一个包中的类还是不同包中的类;2、protected修饰符等等。

2023.09.20

828

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 11.9万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.5万人学习