新闻中心
在Webpack中导出TypeScript类供J*aScript项目直接使用

本教程详细阐述了如何在Webpack配置中,通过`output.library`和`output.library.type`(或`output.libraryTarget`)选项,将TypeScript项目编译并打包的J*aScript代码,以库的形式暴露给外部纯J*aScript环境。文章涵盖了两种主要方式:通过UMD模块暴露为命名空间对象,以及直接将类暴露到全局作用域,旨在解决在HTML页面中直接使用打包后的TypeScript类时遇到的`ReferenceError`问题。
问题概述
在TypeScript项目中,当我们将代码编译并使用Webpack打包成一个J*aScript文件(例如bundled.js),并尝试在普通的HTML页面中直接使用其中定义的类时,常常会遇到Uncaught ReferenceError: TheClass is not defined的错误。这通常是因为Webpack默认的打包方式是为了模块化环境(如CommonJS, ES Modules)设计的,它会将模块内容封装起来,而不是直接暴露到全局作用域。
例如,在以下场景中:
src/main.ts
export class TheClass {
constructor() {
console.log("TheClass has been instantiated!");
}
}index.html
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<script src="../dist/bundled.js"></script>
<script>
new TheClass(); // 此时会抛出 ReferenceError
</script>
</body>
</html>为了解决这个问题,我们需要配置Webpack的output选项,明确告诉它如何将打包后的代码作为库导出。
解决方案一:使用UMD模块暴露为命名空间对象
一种通用的方法是使用libraryTarget: 'umd'和library选项,将你的模块导出为一个UMD(Universal Module Definition)库。UMD模块旨在兼容多种环境,包括浏览器全局变量、CommonJS和AMD。
当设置为UMD时,你需要为你的库指定一个全局名称。这样,你的类将作为这个全局名称下的一个属性被访问。
Webpack配置 (webpack.config.js)
const path = require("path");
module.exports = {
mode: "development",
entry: "./src/main.ts",
devtool: "inline-source-map",
module: {
rules: [
{
test: /\.tsx?$/,
include: path.resolve(__dirname, "src"),
use: "ts-loader",
exclude: /node_modules/,
},
],
},
resolve: {
extensions: [".tsx", ".ts", ".js"],
},
output: {
libraryTarget: 'umd', // 指定输出为UMD模块
library: 'MyLibrary', // 定义全局库名称
filename: "bundled.js",
path: path.resolve(__dirname, "dist"),
},
};解释:
- libraryTarget: 'umd':告诉Webpack生成一个UMD格式的库。这意味着你的库可以在浏览器环境(通过全局变量)、Node.js环境(通过require)或AMD环境(通过define)中使用。
- library: 'MyLibrary':定义了在浏览器环境中,你的库将通过window.MyLibrary访问。
在HTML中使用:
仿淘宝五一落叶微风特别版
1. 商品出售包含拍卖模式,一口价模式。2. 全套系统采用淘宝网风格,成熟,简洁大方3. 每个商品支持多张图片上传,可自由设定,满足广大网民的迫切要求4. 商品发布页采用强大的多功能在线编辑器全面支持HTML,多彩文字,图文并茂,并支持直接从WORD中拷贝5.店铺中心支持多模板选项,目前带有两种风格。6.支持求购信息分类检索和地区检索7. 系统整合网银在线支付功能,使交易更方便,安全快捷8. 拥有
0
查看详情
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<script src="../dist/bundled.js&q
uot;></script>
<script>
// 现在可以通过 MyLibrary 命名空间访问 TheClass
new MyLibrary.TheClass(); // 正常工作
</script>
</body>
</html>关于export default: 如果你在TypeScript文件中使用export default class TheClass {},并且Webpack配置中library: 'MyLibrary',那么MyLibrary本身将是这个默认导出的类。此时,你可以直接通过new MyLibrary()来实例化该类,而无需通过MyLibrary.TheClass。
解决方案二:直接暴露到全局作用域
如果你希望直接通过类名(例如TheClass)来访问你的类,而不是通过一个命名空间(例如MyLibrary.TheClass),你可以使用output.library.type选项并将其设置为'window'或'global'。这将直接在浏览器(window)或Node.js(global)的全局对象上创建一个与你的类名相同的变量。
Webpack配置 (webpack.config.js)
const path = require("path");
module.exports = {
mode: "development",
entry: "./src/main.ts",
devtool: "inline-source-map",
module: {
rules: [
{
test: /\.tsx?$/,
include: path.resolve(__dirname, "src"),
use: "ts-loader",
exclude: /node_modules/,
},
],
},
resolve: {
extensions: [".tsx", ".ts", ".js"],
},
output: {
library: {
name: 'TheClass', // 直接将类名作为全局变量名
type: 'window', // 将其暴露到 window 对象上
},
filename: "bundled.js",
path: path.resolve(__dirname, "dist"),
},
};解释:
- library.name: 'TheClass':指定了在全局作用域中访问你的类的名称。
- library.type: 'window':告诉Webpack将你的模块(这里是TheClass)直接赋值给window.TheClass。如果你在Node.js环境中使用,可以使用'global'。
在HTML中使用:
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<script src="../dist/bundled.js"></script>
<script>
// 现在可以直接通过类名访问 TheClass
new TheClass(); // 正常工作
</script>
</body>
</html>总结与注意事项
-
libraryTarget: 'umd' vs. library.type: 'window':
- umd 提供了更广泛的兼容性,适用于你的库可能在多种J*aScript环境(浏览器、Node.js、AMD)中被消费的情况。它通常会将你的导出封装在一个命名空间对象下。
- window (或 global) 更直接,它会将你的导出直接挂载到全局对象上,适用于你只需要在浏览器环境中以全局变量形式使用的情况。这使得你可以直接通过类名访问。
导出语法: 确保你的TypeScript类是导出的(export class TheClass {} 或 export default class TheClass {}),这样Webpack才能识别并将其作为模块的导出内容。
tsconfig.json 配置: target 和 module 选项在 tsconfig.json 中影响TypeScript的编译结果。例如,"target": "ES5" 和 "module": "ES6" 是常见的配置,它们决定了TypeScript代码的J*aScript版本和模块系统。Webpack会在打包时处理这些模块。
devtool 选项: 在开发模式下,devtool: "inline-source-map" 等选项有助于调试,它能将打包后的J*aScript代码映射回原始的TypeScript源代码。
通过正确配置Webpack的output选项,你可以灵活地控制TypeScript类如何从打包后的J*aScript文件中暴露出来,以满足不同项目和使用场景的需求。
以上就是在Webpack中导出TypeScript类供J*aScript项目直接使用的详细内容,更多请关注其它相关文章!
# es6
# javascript
# typescript
# node
# json
# node.js
# js
# html
# java
# 东莞seo广告公司
# fiam seo锁体
# 邯郸违规网站建设项目
# 聊城网站建设目标定位
# 门户网站建设讲解透彻
# 台州专业网站建设费用
# 北仑区网站优化费用
# 烩面推广营销方案模板
# 营销方式网络营销推广
# 银川网站建设公司教程
# 会将
# 设置为
# 怎么做
# 适用于
# 两种
# 你在
# 如何实现
# 全局变量
# 淘宝
# 你可以
# 浏览器
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
J*a中实现Go语言select通道多路复用机制
网易大神账号申诉需要多久_网易大神账号申诉流程说明
Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧
如何在网页中实现特定地点的随机图片展示
俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达
期待已久:小米17 Ultra、小米首款NAS本月登场
Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问
CSS布局中意外空白:解决padding-top导致的顶部间距问题
印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】
Win11怎么关闭快速启动_Win11彻底关机设置教程
打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门
小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】
俄罗斯方块最新版入口 俄罗斯方块在线玩官网入口
jQuery Mask 插件中实现电话号码固定前导零的教程
韩剧圈正版入口页面_韩剧圈官网登录链接
KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明
J*aScript实现动态背景色下的文本与按钮颜色自适应调整
Python中如何避免重复条件判断:利用数据结构实现动态逻辑
Win11截图该按哪些键 Win11截屏完整流程解析【教程】
Golang如何使用net/url解析URL_Golang URL解析与处理方法
优化HTML表单样式:解决输入框焦点跳动与元素间距问题
mysql备份恢复性能优化_mysql备份恢复性能优化方法
消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技
理解J*aScript Promise的微任务队列与执行顺序
在python-socketio事件处理器中安全访问Flask应用上下文
MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具
qq游戏手机版下载安装_qq游戏移动端入口
vivo云服务网页版登录 怎么登录vivo云服务网页版
漫蛙MANWA漫画主页官方入口 漫蛙漫画最新在线阅读地址
Angular中父组件异步更新子组件复选框状态的实践指南
J*a应用程序首次运行自动创建文件与目录的最佳实践
如何在Python中使用Optional类型处理可变对象并避免Pylint警告
如何提高微信支付的安全性_微信支付安全防护与设置建议
如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略
2026春节假期时间安排 2026春节假日查询
qq游戏跨平台入口_qq游戏多设备同步登录
如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置
Selenium Python中处理点击后新窗口加载冻结问题的策略与实践
Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全
处理Kafka消费者会话超时:深入理解消息处理语义与幂等性
微信聊天记录怎么加密_微信聊天记录加密方法
126邮箱网页版官方入口 126邮箱账号在线登录平台
C++指针和引用有什么区别_C++内存管理核心概念深度解析
12306选座怎么选到临时改签座_12306改签选座策略与步骤
荣耀Play7T运行卡顿解决_荣耀Play7T性能优化
为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法
PHP 枚举:根据字符串获取枚举案例的策略与实现
海棠电脑版入口_通过电脑访问海棠官网阅读
Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程
Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧


2025-12-03
浏览次数:次
返回列表
uot;></script>
<script>
// 现在可以通过 MyLibrary 命名空间访问 TheClass
new MyLibrary.TheClass(); // 正常工作
</script>
</body>
</html>