5.使用webpack打包ts代码

2023-10-26

1.初始化项目

在终端中执行命令npm init -y,执行完此命令将会在项目中生成配置文件package.json

2.安装webpack所需要的依赖

npm i -D webpack webpack-cli typescript ts-loader,-D表示开发依赖
安装完成后将在package.json文件中生成以下代码

"devDependencies": {
    "ts-loader": "^9.4.1",
    "typescript": "^4.8.4",
    "webpack": "^5.75.0",
    "webpack-cli": "^4.10.0"
}

3.编写webpack配置文件

在项目中创建文件webpack.config.js
写入以下代码:

// 引入一个包,主要用于拼接路径
const path = require('path');

// webpack中的所有配置信息都应该写在module.exports中
module.exports = {

    // 指定入口文件
    entry: './src/index.ts',

    // 指定打包文件所在目录
    output: {
        // 指定打包文件的目录
        path: path.resolve(__dirname, 'dist'),
        // 打包后文件的名字
        filename: 'bundle.js'
    },

    // 指定webpack打包时要使用的模块
    module: {
        // 指定要加载的规则
        rules: [
            {
                // test指定的是规则生效的文件
                test: /\.ts$/,
                // 要使用的loader
                use: 'ts-loader',
                // 要排除的文件
                exclude: /node-modules/
            }
        ]
    }
}

4.编写ts配置文件

在项目中创建文件tsconfig.json(可在终端输入tsc --init快速生成)
写入以下代码:

{
  "compilerOptions": {
    "target": "ES2015",
    "module": "ES2015",
    "strict": true,
  }
}

5.修改package.json

在package.json的script中写入"build": "webpack"

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack"
},

6.执行webpack

在终端中输入npm run build
执行完命令后,项目中生成文件夹dist,其中包含文件bundle.js

入口文件 ‘./src/index.ts’ 代码:

function sum(a: number, b: number): number {
    return a + b;
}
console.log(sum(123, 456));

打包后的文件 ‘./dist/bundle.js’ 代码:

(()=>{"use strict";console.log(579)})();

其他webpack配置

自动生成html文件

npm i -D html-webpack-plugin
此插件可帮助我们自动生成html文件

在webpack.config.js中引入html插件

const HTMLWebpackPlugin = require('html-webpack-plugin');

并在module.exports中写入:

// 配置webpack插件
plugins: [
	new HTMLWebpackPlugin(),
]

终端执行npm run build命令后即可在 /dist 目录下生成html文件

也可以将写好的html模板放在 src 文件夹下,同时将plugins内容改为:

// 配置webpack插件
    plugins: [
        new HTMLWebpackPlugin({
            // title: "这是一个自定义的title"
            template: './src/index.html'
        }),
    ]

即可根据模板来生成html

webpack开发服务器

npm i -D webpack-dev-server
安装webpack开发服务器

修改package.json

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack",
    "start": "webpack serve --open"
},

终端执行npm start

此时网页将会自动打开,同时开启热加载模式,当文件中代码发生变化时,网页也会自动更新

更新打包文件所在目录

npm i -D clean-webpack-plugin
此插件可清除打包文件所在目录

在webpack.config.js中引入clean插件

// 引入clean插件
const { CleanWebpackPlugin } = require('clean-webpack-plugin');

并在module.exports中写入:

// 配置webpack插件
plugins: [
	new CleanWebpackPlugin(),
]

以后每次执行打包命令时,会先将打包文件所在目录清空,然后再重新生成打包后的文件

设置引用模块

在src目录下新建文件m1.ts

export const hi = "您好";

在index.ts引入该模块

import { hi } from './m1'

此时npm run build将会报错,因为webpack不知道哪些文件可以作为模块被引入

因此需要修改webpack.config.js的module.exports代码

// 用来设置引用模块
resolve: {
	extensions: ['.ts', '.js']
}

浏览器兼容

npm i -D @babel/core @babel/preset-env babel-loader core-js

修改webpack.config.js中的module

// 指定webpack打包时要使用的模块
    module: {
        // 指定要加载的规则
        rules: [
            {
                // test指定的是规则生效的文件
                test: /\.ts$/,
                // 要使用的loader
                use: [
                    // 配置babel
                    {
                        // 指定加载器
                        loader: 'babel-loader',
                        // 设置babel
                        options: {
                            // 设置预定义的环境
                            presets: [
                                [
                                    // 指定环境的插件
                                    "@babel/preset-env",
                                    // 配置信息
                                    {
                                        // 要兼容的目标浏览器
                                        targets: {
                                            "chrome": "58",
                                            "ie": "11",
                                        },
                                        // 指定corejs的版本
                                        "corejs": "3",
                                        // 使用corejs的方式,"usage"表示按需加载
                                        "useBuiltIns": "usage"
                                    }
                                ]
                            ]
                        }
                    },
                    'ts-loader',
                ],
                // 要排除的文件
                exclude: /node-modules/
            }
        ]
    },

在src目录下的index.ts中增加以下代码:

const obj = { name: '张三', age: 88 };
console.log(obj);
obj.age = 8;
console.log(obj);

由于我们指定要兼容的IE浏览器版本为11,const关键字无法被解析,故打包后生成的bundle.js将以上代码解析为:

var o={name:"张三",age:88};console.log(o),o.age=8,console.log(o)

由于打包后的bundle.js中使用到了箭头函数,若要对IE11等低版本浏览器兼容,还需要在webpack.config.js的output中加入以下代码:

// 告诉webpack不使用箭头函数,以便兼容IE
	environment: {
		arrowFunction: false
	}

报错

npm run build时出现警告

The 'mode' option has not been set, webpack will fallback to 'production' for this value.
Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior.

在module.exports中加入一行代码即可:

mode: 'production', // 设置mode development/production

完整代码

package.json:

{
  "name": "part3",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack",
    "start": "webpack serve --open"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@babel/core": "^7.20.2",
    "@babel/preset-env": "^7.20.2",
    "babel-loader": "^9.1.0",
    "clean-webpack-plugin": "^4.0.0",
    "core-js": "^3.26.1",
    "html-webpack-plugin": "^5.5.0",
    "ts-loader": "^9.4.1",
    "typescript": "^4.8.4",
    "webpack": "^5.75.0",
    "webpack-cli": "^4.10.0",
    "webpack-dev-server": "^4.11.1"
  }
}

webpack.config.js:

// 引入一个包,主要用于拼接路径
const path = require('path');
// 引入html插件
const HTMLWebpackPlugin = require('html-webpack-plugin');
// 引入clean插件
const { CleanWebpackPlugin } = require('clean-webpack-plugin');

// webpack中的所有配置信息都应该写在module.exports中
module.exports = {

    // 指定入口文件
    entry: './src/index.ts',

    // 指定打包文件所在目录
    output: {
        // 指定打包文件的目录
        path: path.resolve(__dirname, 'dist'),
        // 打包后文件的名字
        filename: 'bundle.js',

        // 告诉webpack不使用箭头函数,以便兼容IE
        environment: {
            arrowFunction: false
        }
    },


    mode: 'production', // 设置mode development/production

    // 指定webpack打包时要使用的模块
    module: {
        // 指定要加载的规则
        rules: [
            {
                // test指定的是规则生效的文件
                test: /\.ts$/,
                // 要使用的loader
                use: [
                    // 配置babel
                    {
                        // 指定加载器
                        loader: 'babel-loader',
                        // 设置babel
                        options: {
                            // 设置预定义的环境
                            presets: [
                                [
                                    // 指定环境的插件
                                    "@babel/preset-env",
                                    // 配置信息
                                    {
                                        // 要兼容的目标浏览器
                                        targets: {
                                            "chrome": "58",
                                            "ie": "11",
                                        },
                                        // 指定corejs的版本
                                        "corejs": "3",
                                        // 使用corejs的方式,"usage"表示按需加载
                                        "useBuiltIns": "usage"
                                    }
                                ]
                            ]
                        }
                    },
                    'ts-loader',
                ],
                // 要排除的文件
                exclude: /node-modules/
            }
        ]
    },

    // 配置webpack插件
    plugins: [
        new CleanWebpackPlugin(),
        new HTMLWebpackPlugin({
            // title: "这是一个自定义的title"
            template: './src/index.html'
        }),
    ],

    // 用来设置引用模块
    resolve: {
        extensions: ['.ts', '.js']
    }
}


index.ts:

import { hi } from './m1'

function sum(a: number, b: number): number {
    return a + b;
}

console.log(sum(123, 456));
console.log(hi);

const obj = { name: '张三', age: 88 };
console.log(obj);
obj.age = 8;
console.log(obj);

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

5.使用webpack打包ts代码 的相关文章

  • 使用 javascript 调用 ViewComponent

    我有一个带有几个视图组件的网页 当我单击这些组件时 我会为其打开一个简单的编辑器 请参见下图 如果我编辑文本并按 Enter 键 我想重新渲染视图组件而不是孔页面 是否可以使用 javascript 调用视图组件来获得此行为 通过更新 您现
  • 允许指针(单击)事件穿过元素,同时保持滚动功能

    我的目标是拥有一个允许 下面要点击 交互的元素 滚动 众所周知 1 的解是pointer events none 这正如中所描述的单击 DIV 到底层元素 https stackoverflow com questions 3680429
  • 如何制作像Stackoverflow一样的可折叠评论框

    我正在构建一个网站 并且有一个状态更新列表 我希望允许用户为列表中的每个项目撰写评论 但是我正在尝试实现一个类似于堆栈溢出工作方式的用户界面 特别是可折叠的评论表单 列表 用户在其中单击对列表中的特定状态更新添加评论 并且在列表中的该项目下
  • 从 DOM 中删除后,动态添加的 JavaScript 脚本会继续执行

    因此 我正在创建一个 SPA 并使用 AJAX 将 HTML 页面加载到我网站的索引页面中 问题是 当包含我的一个页面时 它似乎会徘 徊并执行其中的 JavaScript 代码 即使它随后从 DOM 中删除 索引 html 正文 div d
  • 如何在 Chrome 中实现抓取光标图标?

    我知道可以在 Chrome 中使用抓取光标图标 当然是在 Gmail 中 但我不知道如何在我的代码中实现它 我已经尝试过 在CSS中 body cursor grab body cursor webkit grab body cursor
  • 通过 HTML5 文件和 URL API 正确创建和提供 PDF Blob

    好吧 假设我有文档数据存储在某处 让我们任意取this pdf http www grida no climate ipcc tar wg1 pdf tar 01 pdf 问题 1 我想要做的是对此 URL 进行 AJAX 调用 因为我需要
  • React延迟加载/无限滚动解决方案

    我花了一段时间才弄清楚如何使用优秀的延迟加载图像React Lazyload 组件 https github com jasonslyvia react lazyload 演示在滚动时延迟加载图像 但在测试时我无法获得相同的行为 罪魁祸首是
  • 检测 iframe 内容加载失败

    我可以使用以下命令检测 iframe 的内容何时加载load事件 不幸的是 就我的目的而言 这有两个问题 如果加载页面时出现错误 404 500 等 则永远不会触发加载事件 如果某些图像或其他依赖项加载失败 则会照常触发加载事件 有什么方法
  • 区分单击与 mousedown/mouseup

    我已经阅读了有关这种情况的 stackoverflow 上的几个答案 但没有一个解决方案有效 我尝试根据用户是否单击某个元素或使用 jQuery 将鼠标按住该元素来执行不同的操作 有可能做到这一点吗 onMouseDown 将在按下左侧或右
  • 为什么“dtoa.c”包含这么多代码?

    我将是第一个承认我对低级编程的整体知识有点稀疏的人 我理解许多核心概念 但我不经常使用它们 话虽这么说 我对需要多少代码感到非常惊讶dtoa c http www netlib org fp dtoa c 在过去的几个月里 我一直致力于用
  • 使用 easyXDM 调整 IFrame 大小

    我将 iFrame 代码提供给客户 以便他们可以显示我网站上的动态内容 我希望其页面上的 iFrame 能够调整大小以适合我的内容 我按照 easyXDM 网站的说明进行操作 但也许我遗漏了一些东西 我没有收到任何错误 但 iFrame 保
  • 如何向尚未添加到页面的元素注册 Javascript 事件处理程序

    我正在尝试构建一个greasemonkey 脚本 它将根据用户与其他动态创建的数据表的交互动态创建数据表 我的问题是 每次创建表时 我都必须进行两次传递 一次用于创建表 另一次用于获取表中我想要添加事件处理程序的所有对象 通过 id 并添加
  • Angular-Datatables + Angular-xeditable:取消可编辑行

    当组合 Angular DataTables 和 Angular XEditable 时 添加新行时会取消可编辑行 这是jsfiddle https jsfiddle net faj61h5d 10 示例操作如下 1 这是初始状态 2 将第
  • t /= d 是什么意思? Python 和错误

    t current time b begInnIng value c change In value d duration def easeOutQuad swing function x t b c d alert jQuery easi
  • 全局定义的 AngularJS 控制器和封装

    根据 AngularJS 的教程 控制器函数仅位于全局范围内 http docs angularjs org tutorial step 04 http docs angularjs org tutorial step 04 控制器函数本身
  • IE6 丢失查询字符串

    我有一个使用 javascript 从查询字符串中获取值的页面window location 从网络服务器运行时效果很好 但如果我通过将其放在地址栏中使用 IE6 在本地运行它 c mysite index htm 网站创建的任何查询字符串
  • Tween JS 基础知识之三个 JS 立方体

    我是 Tween JS 的新手 尝试使用 Tween 制作一个向右移动的简单动画 下面是我在 init 函数中的代码 我使用的是三个 JS var geometry new THREE CylinderGeometry 200 200 20
  • 如何使用 .append() 将 React 组件附加到 HTML 元素

    我正在尝试对我的博客实现无限滚动 我有 const articlesHTML document querySelector articles 作为容器 每次点击装载更多按钮 我想将新文章附加到主 html 元素 如下所示 const res
  • 使用 JavaScript 从 URL 变量读取来加载不同的 CSS 样式表

    我试图在我的 WordPress 博客上使用两个不同的样式表 以便在通过 Web 访问页面时使用一个样式表 而在通过我们的 iOS 应用程序访问博客内容时使用另一个样式表 现在 我们将 app true 附加到来自 iOS 应用程序的 UR
  • 我可以防止将 Leaflet 地图平移到世界边缘之外吗?

    有没有办法限制平移到世界边缘之外 在这幅画中 棕色是世界 灰色是虚空 我想让它不可能像这样平移 Leaflet 允许您控制地图抵抗被拖出边界的程度maxBoundsViscosity选项 值 0 到 1 将其设置为最大值会完全禁用拖动出界

随机推荐

  • 有源带阻和无源带阻的区别_浅析无源滤波和有源滤波组成的滤波电路以及运放反馈...

    小编前几篇和大家一起初步的浅析了无源滤波和有源滤波组成的滤波电路以及运放反馈的分类 先和大家一起回顾一下 有源滤波分为 低通滤波 积分电路 高通滤波 微分电路 带通滤波 后期再和大家分享 带阻滤波 后期再和大家分享 运放电路反馈分为 电流反
  • python算法:求a+aa+aaa.....的和

    题目 给定两个均不超过9的正整数a和n 要求编写函数fn a n 求a aa aaa aa aa n个a 之和 fn须返回的是数列和 其中 a 和 n 都是用户传入的参数 a 的值在 1 9 范围 n 是 1 9 区间内的个位数 函数须返回
  • 划片机实现装片、对准、切割、清洗到卸片的自动化操作

    划片机是一种用于切割和分离材料的设备 通常用于光学和医疗 IC QFN DFN 半导体集成电路 GPP LED氮化镓等芯片分立器件 LED封装 光通讯器件 声表器件 MEMS等行业 划片机可以实现从装片 对准 切割 清洗到卸片的自动化操作
  • 面向对象设计原则——迪米特法则

    一 背景 软件编程的总的原则 低耦合 高内聚 无论是面向过程编程还是面向对象编程 只有使各个模块之间的耦合尽量的低 才能提高代码的复用率 低耦合的优点不言而喻 但是怎么样编程才能做到低耦合呢 那正是迪米特法则要去完成的 二 迪米特法则 迪米
  • 语音识别开源框架

    语音识别开源框架 文章目录 语音识别开源框架 Whisper 特征 Github地址 开源文档介绍 论文参考 ASRT 特征 环境 Github地址 开源文档介绍 DeepSpeech 特征 环境 Github地址 文档介绍 论文参考 De
  • 使用Flask渲染静态网页(模板)

    假设我们有了一个已经写好的网页 我们希望把这个网页展示出来 我们需要怎么做呢 在Flask中我们把这一工作叫做渲染模板 其中我们准备好的网页叫做模板 渲染工作交给一个叫做jinja2的模板引擎就好了 具体使用方法是调用函数render te
  • API服务网关实现之APISIX安装和部署

    一 APISIX相关介绍 1 安全网关 安全网关设置的目的是防止Internet或外网不安全因素蔓延到自己企业或组织的内部网 安全网关在应用层和网络层上面都有防火墙的身影 其范围从协议级过滤到十分复杂的应用级过滤等 推荐了解传智播客linu
  • 九、SQL-labs的第24关——二次注入(Post)

    二次注入首先的一点就要在HTTP请求中提交恶意代码 将这个恶意代码存储在数据库中 以便后面使用 在第24关 我们是通过注册新账号这种方式 将恶意代码存储到数据库中 假设我们的攻击目标是Dummy 1 将恶意代码存储到数据库中 点击注册 输入
  • Hive-Hive排序

    1 DQL 排序问题 1 1 order by 默认是升序asc 可指定降序desc order by是全局排序 只能有一个reduce作业来完成 多个reduce 如何保证全局顺序 hive mapred mode改为strict 则使用
  • 常用的工具

    进程 1 IDA 交互式反汇编器专业版 Interactive Disassembler Professional 简称为IDA IDA Pro是一款支持交互 可编程的 扩展插件 支持多种处理器的逆向工程利器 我一般用来看看库依赖 2 Pr
  • CMake学习之include

    文章目录 一 cmake incldue 二 示例 一 cmake incldue 从给定的文件中读取CMake的列表文件 include file OPTIONAL RESULT VARIABLE VAR 从给定的文件中读取CMake的清
  • 腾讯公司面试题【1】

    腾讯面试题 给你10分钟时间 根据上排给出十个数 在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数 上排的十个数如下 0 1 2 3 4 5 6 7 8 9 举一个例子 数值 0 1 2 3 4 5 6 7 8
  • 数据库并发操作和封锁技术

    数据库在使用时许多事务可能同时对同一数据进行并发操作此时会破坏数据库的完整性 并发 指的是在一个CPU上利用分时方法实行多个事务同时做 一般数据库的并发操作会带来三个问题 1 丢失更新 2 读脏数据 3 不可重复读 个人的解释 1 丢失更新
  • 基于Pytorch语义分割模型的C++部署教程,CPU版本

    基于Pytorch语义分割模型的C 部署教程 CPU版本 1 pth权重文件转pt权重文件 两种pth保存的方式 模型转换 2 C libtorch的下载与环境配置 libtorch下载 Libtorch C 环境的配置 3 C 下pt文件
  • 数学甜点004

    数学是一门及其高深又变幻莫测的学科 且其根本就是问题的解决 因此是不可能也没有必要去寻找一种能够解决所有问题的通解的 坦白说 研究数学的最大乐趣就是在于发现从来没有人走过的新道路 即一种不同于常规的具有跳跃性 构造性的解法 换句话说 无论是
  • 解决jupyter “Running as root is not recommended.xxx”错误 && jupyter配置方法

    文章目录 1 问题解决 1 1 产生jupyter配置文件 1 2 修改配置文件 2 jupyter配置 3 jupyter修改密码 1 问题解决 运行jupyter notebook jupyter lab出现 Running as ro
  • Java8 操作集合汇总

    文章目录 优雅的将一个对象的集合转化成另一个对象的集合 交集 list1 list2 差集 并集 去重并集 从List中过滤出一个元素 Map集合转 List Collectors toList Collectors toMap List集
  • Vue研习录(07)——组件基础知识详解及示例分析

    Vue研习录 07 组件基础知识详解及示例分析 版权声明 一 什么是组件 二 定义组件 三 加载组件 四 scoped属性 五 props组件交互 六 自定义事件组件交互 七 组件生命周期 版权声明 本文原创作者 清风不渡 博客地址 htt
  • SLAM数据集【百度网盘】

    转载自 http www taodudu cc news show 4751906 html action onClick SLAM数据集 1 TUM数据集 1 1 RGB D 数据集 1 2 VIO 数据集 1 3 单目数据集 2 EUR
  • 5.使用webpack打包ts代码

    1 初始化项目 在终端中执行命令npm init y 执行完此命令将会在项目中生成配置文件package json 2 安装webpack所需要的依赖 npm i D webpack webpack cli typescript ts lo