教你使用webpack打包编译TypeScript代码

yizhihongxing

教你使用webpack打包编译TypeScript代码

为什么要使用webpack和TypeScript?

在前端开发的过程中,我们经常需要使用Webpack来统一打包我们的前端代码,将多个js、css文件合并成一个或多个bundles,减小代码的体积,并且利于加载和缓存。

而TypeScript是JavaScript的一种超集,它给JavaScript加上了一些静态类型,使得代码更加可读、可维护,同时提供了更好的IDE支持和错误检测,是一个非常优秀的编程语言。

因此在前端开发中,结合使用Webpack和TypeScript可以提高开发效率和代码的可维护性。

步骤

  1. 初始化项目

首先,我们需要在项目根目录下初始化一个package.json文件,用于管理项目的依赖。

可以使用如下的命令在命令行中初始化:

bash
npm init -y

这个命令会在当前目录下生成一个默认的package.json文件。

  1. 安装Webpack和TypeScript

在命令行中执行以下命令,安装Webpack和TypeScript:

bash
npm install webpack webpack-cli typescript ts-loader --save-dev

  • webpack和webpack-cli:用于Webpack的打包和构建。
  • typescript:TypeScript编译器。
  • ts-loader:Webpack的TypeScript加载器,用于将TypeScript代码转为JavaScript代码。

  • 配置TypeScript

在项目根目录下,创建一个tsconfig.json文件,用于配置TypeScript的编译选项。

示例:

json
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": true,
"allowJs": true,
"outDir": "./dist",
"esModuleInterop": true
},
"include": ["./src/**/*"]
}

  • compilerOptions:编译选项。
  • include:需要编译的文件目录。

  • 配置Webpack

在项目根目录下,创建一个webpack.config.js文件,用于配置Webpack的打包选项。

示例:

```javascript
const path = require('path');

module.exports = {
mode: 'development',
entry: './src/main.ts',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
},
resolve: {
// 添加 '.ts' 和 '.tsx' 后缀
extensions: ['.ts', '.tsx', '.js']
},
module: {
rules: [
{
test: /.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/,
},
],
},
};
```

  • mode:指定构建模式,可以是development或production。
  • entry:指定入口文件。
  • output:指定输出文件的名称和目录。
  • resolve:指定可处理的文件后缀名。
  • module:指定webpack的module相关配置项。

    • rules:指定规则,用于对指定文件进行一系列处理。
    • test:指定需要处理的文件匹配规则。
    • use:指定使用的loader。
    • exclude:指定需要排除的文件或目录。
  • 编写代码

在src目录下编写TypeScript代码。

示例:

```typescript
const greeting: string = 'Hello, TypeScript!';

console.log(greeting);
```

  1. 打包代码

在命令行中执行以下命令,打包代码:

bash
npx webpack

执行完这个命令后,Webpack将会根据配置文件和指定的入口文件将代码打包到dist/bundle.js文件中。

  1. 运行代码

在浏览器中打开dist目录下的index.html文件,看到控制台输出"Hello, TypeScript!"即表示运行成功。

示例1

现在,让我们来看一个实际的例子,如何在TypeScript中使用Vue3和ElementUI,并通过Webpack进行打包。

  1. 初始化项目

在命令行中执行以下命令,初始化项目:

bash
vue create vue-ts-element-webpack

具体的Vue CLI使用可以参考Vue CLI 官方文档

  1. 安装依赖

在命令行中执行以下命令,安装依赖:

bash
cd vue-ts-element-webpack
npm install vue@next @vue/compiler-sfc element-plus --save

具体的Vue3和ElementUI使用可以参考Vue3 官方文档ElementUI 官方文档

  1. 配置TypeScript

在项目根目录下,创建tsconfig.json文件,添加以下配置项:

json
"moduleResolution": "node",
"esModuleInterop": true,
"jsx": "preserve",
"allowSyntheticDefaultImports": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"module": "es6",
"isolatedModules": false,
"target": "es6",
"lib": ["esnext", "dom"],
"strict": true,
"experimentalDecorators": true

  1. 配置Webpack

在项目根目录下,创建webpack.config.js文件,添加以下配置项:

```javascript
const path = require('path');
const { DefinePlugin } = require('webpack');
const { VueLoaderPlugin } = require('vue-loader');
const { ESBuildMinifyPlugin } = require('esbuild-loader');

module.exports = {
mode: 'production',
entry: './src/main.ts',
output: {
filename: '[name].[contenthash].js',
path: path.resolve(__dirname, 'dist'),
},
module: {
rules: [
{
test: /.vue$/,
use: 'vue-loader',
},
{
test: /.ts$/,
loader: 'esbuild-loader',
options: {
loader: 'ts',
target: 'es2015',
},
exclude: /node_modules/,
},
{
test: /.css$/,
use: ['style-loader', 'css-loader'],
},
{
test: /.(png|jpe?g|gif)$/i,
use: [
{
loader: 'file-loader',
options: {
esModule: false,
name: '[name].[hash:8].[ext]',
outputPath: 'img',
publicPath: './img',
},
},
],
},
],
},
resolve: {
extensions: ['.ts', '.js', '.vue'],
alias: {
vue$: 'vue/dist/vue.runtime.esm-bundler.js',
'@': path.resolve(__dirname, 'src'),
},
},
plugins: [
new DefinePlugin({
'process.env': {
NODE_ENV: JSON.stringify(process.env.NODE_ENV),
},
}),
new VueLoaderPlugin(),
new ESBuildMinifyPlugin(),
],
optimization: {
splitChunks: {
chunks: 'all',
},
},
};
```

在这个配置文件中,我们使用了:

  • vue-loader:处理Vue文件的Webpack加载器。
  • esbuild-loader:使用ESBuild来编译TypeScript文件。
  • DefinePlugin:定义环境变量,用于指定NODE_ENV。

  • 编写代码

在src目录下编写代码。

示例:

```typescript
import { createApp } from 'vue';
import ElementPlus from 'element-plus';
import 'element-plus/lib/theme-chalk/index.css';

import App from './App.vue';

const app = createApp(App);

app.use(ElementPlus);
app.mount('#app');
```

  1. 打包代码

在命令行中执行以下命令,打包代码:

bash
npx webpack

执行完这个命令后,Webpack将会根据配置文件和指定的入口文件将代码打包到dist目录下。

然后打开dist目录下的index.html文件,在浏览器中运行,可以看到包含ElementUI的Vue3应用已经成功运行。

示例2

接下来,我们再来看一个比较复杂的案例,比如在TypeScript + React + Redux + Antd的开发环境下,如何通过Webpack进行打包。

  1. 初始化项目

在命令行中执行以下命令,初始化项目:

bash
npx create-react-app react-ts-redux-antd --template typescript
cd react-ts-redux-antd
npm install antd redux @types/react-redux @types/react-dom --save

具体的React、Redux和Antd的使用可以参考React官方文档Redux官方文档Antd官方文档

  1. 安装依赖

在命令行中执行以下命令,安装依赖:

bash
npm install webpack webpack-cli webpack-dev-server clean-webpack-plugin html-webpack-plugin css-loader style-loader less-loader less postcss-loader autoprefixer babel-loader @babel/core @babel/preset-react @babel/preset-typescript --save-dev

其中,babel-loader和@babel/preset-react用于将JSX语法转为JavaScript语法,@babel/preset-typescript用于将TypeScript代码转为JavaScript代码。

  1. 配置TypeScript

在项目根目录下,创建tsconfig.json文件,添加以下配置项:

json
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"jsx": "react",
"sourceMap": true,
"allowJs": true,
"outDir": "./dist",
"esModuleInterop": true,
"isolatedModules": true,
"strict": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"noImplicitAny": true,
"moduleResolution": "node",
"allowSyntheticDefaultImports": true,
"lib": ["es2015", "dom"]
},
"include": ["src"]
}

  1. 配置Webpack

在项目根目录下,创建webpack.config.js文件,添加以下配置项:

```javascript
const path = require('path');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
mode: 'development',
entry: './src/index.tsx',
devtool: 'inline-source-map',
devServer: {
contentBase: './dist',
historyApiFallback: true,
hot: true,
},
output: {
filename: '[name].[hash].js',
path: path.resolve(__dirname, 'dist'),
publicPath: '/',
},
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
template: './public/index.html',
filename: './index.html',
}),
],
module: {
rules: [
{
test: /.(js|jsx|tsx|ts)$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-react', '@babel/preset-typescript'],
},
},
},
{
test: /.less$/,
use: [
'style-loader',
'css-loader',
{
loader: 'postcss-loader',
options: {
ident: 'postcss',
plugins: [require('autoprefixer')],
},
},
{
loader: 'less-loader',
options: {
lessOptions: {
modifyVars: {
'primary-color': '#f70',
},
javascriptEnabled: true,
},
},
},
],
},
{
test: /.(png|svg|jpg|gif)$/,
use: ['file-loader'],
},
{
test: /.(woff|woff2|eot|ttf|otf)$/,
use: ['file-loader'],
},
],
},
resolve: {
extensions: ['.tsx', '.ts', '.jsx', '.js', '.json'],
},
};
```

  1. 编写代码

在src目录下编写代码。

示例:

```typescript
import React, { useState } from 'react';
import ReactDOM from 'react-dom';
import { createStore } from 'redux';
import { Provider } from 'react-redux';
import { Button } from 'antd';
import './index.less';

interface IState {
count: number;
}

const reducer = (state: IState = { count: 0 }, action: any) => {
switch (action.type) {
case 'INCREMENT':
return { ...state, count: state.count + 1 };
case 'DECREMENT':
return { ...state, count: state.count - 1 };
default:
return state;
}
};

const store = createStore(reducer);

const App = () => {
const [count, setCount] = useState(0);

 return (
   <div>
     <Button onClick={() => setCount(count + 1)}>Click Me</Button>
     <p>You clicked {count} times.</p>
   </div>
 );

};

ReactDOM.render(


,
document.getElementById('root'),
);
```

  1. 打包代码

在命令行中执行以下命令,打包代码:

bash
npx webpack

运行完这个命令后,Webpack将会根据配置文件和指定的入口文件将代码打包到dist目录下。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:教你使用webpack打包编译TypeScript代码 - Python技术站

(0)
上一篇 2023年6月9日
下一篇 2023年6月9日

相关文章

  • node中的session的具体使用

    当在Web应用程序中存储用户数据时,会使用会话(Session)来跟踪和维护用户状态。通常情况下,使用session需要在Web框架中配置和使用,但是在Node.js中,我们可以使用一个非常流行的中间件——express-session来实现会话管理。 安装 npm install express-session 使用 在Express应用程序中使用expr…

    node js 2023年6月8日
    00
  • Node.js中的require.resolve方法使用简介

    当我们在Node.js开发中使用require()方法引入模块时,其实在内部会调用resolve()方法定位模块文件的位置。如果我们只想获取模块的文件路径而不加载它,就可以通过require.resolve()方法来实现。 require.resolve() 方法 require.resolve()方法接受一个模块名字符串作为参数,并且返回该模块的解析路径。…

    node js 2023年6月8日
    00
  • nodejs简单抓包工具使用详解

    下面是“nodejs简单抓包工具使用详解”的完整攻略: 一、前言 在进行 Web 开发时,我们通常需要对网络请求进行调试和分析。使用浏览器的开发者工具可以查看请求和响应的数据,但是有些情况下需要对请求和响应进行更深入的分析,例如查看请求头、响应头等信息。这时候需要使用抓包工具来完成这个任务。本文将介绍如何使用 Node.js 来写简单的抓包工具。 二、使用 …

    node js 2023年6月8日
    00
  • 深入浅析Node.js单线程模型

    深入浅析Node.js单线程模型 Node.js作为一种基于事件驱动的JavaScript运行环境,采用单线程模型(单进程)来实现高并发。本文将从以下几个方面全面介绍Node.js的单线程模型。 Node.js单线程模型的基本原理 Node.js基于事件循环实现单线程模型。它采用事件驱动、异步I/O模型,使得单个线程能够处理大量的并发请求。 事件循环由事件和…

    node js 2023年6月8日
    00
  • 浅谈HTTP 缓存的那些事儿

    以下是浅谈HTTP缓存的攻略。 什么是HTTP缓存? HTTP缓存是指将经常使用的静态资源(如图片、JavaScript、CSS文件等)存储在本地文件系统或浏览器缓存中,以便用户稍后访问同一网站时可以更快地加载该资源。HTTP缓存可以提高网站的性能和速度。 缓存分类 通常,HTTP缓存可以分为两类:浏览器缓存和服务器缓存。 浏览器缓存 浏览器缓存是由浏览器存…

    node js 2023年6月8日
    00
  • Express下采用bcryptjs进行密码加密的方法

    对于“Express下采用bcryptjs进行密码加密的方法”的完整攻略,我们可以分为以下几个步骤: 步骤1:安装bcryptjs模块 首先,在你的项目中安装bcryptjs模块,可以使用npm命令进行安装,命令如下: npm install bcryptjs –save 这个命令会在你的项目中安装bcryptjs模块,并自动将它添加到你的dependen…

    node js 2023年6月8日
    00
  • node.js中的console用法总结

    console的基本用法 console是node.js中一个非常重要的模块,用于在控制台输出日志信息。console的基本用法非常简单,只需要调用其中的log方法即可输出信息。 console.log(‘Hello World’); 上述代码将在控制台输出”Hello World”。 除了基本的log方法外,console还提供了其他方法: console…

    node js 2023年6月8日
    00
  • NodeJs实现简单的爬虫功能案例分析

    Node.js是现在最为流行的后端JavaScript语言之一,也是一种基于事件驱动、非阻塞式I/O模型,轻量且高效的服务端开发框架。利用Node.js可以很方便地实现网络爬虫,下面我们来详细讲解怎样使用Node.js实现简单的爬虫功能。 1. 安装Node.js 在使用Node.js实现网络爬虫之前,我们需要安装Node.js环境。在Node.js的官网上…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部