W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
TypeScript 是 JavaScript 的超集,為其增加了類(lèi)型系統(tǒng),可以編譯為普通 JavaScript 代碼。這篇指南里我們將會(huì)學(xué)習(xí)是如何將 webpack 和 TypeScript 進(jìn)行集成。
首先,執(zhí)行以下命令安裝 TypeScript compiler 和 loader:
npm install --save-dev typescript ts-loader
現(xiàn)在,我們將修改目錄結(jié)構(gòu)和配置文件:
project
webpack-demo
|- package.json
|- package-lock.json
+ |- tsconfig.json
|- webpack.config.js
|- /dist
|- bundle.js
|- index.html
|- /src
|- index.js
+ |- index.ts
|- /node_modules
tsconfig.json
這里我們?cè)O(shè)置一個(gè)基本的配置來(lái)支持 JSX,并將 TypeScript 編譯到 ES5……
{
"compilerOptions": {
"outDir": "./dist/",
"noImplicitAny": true,
"module": "es6",
"target": "es5",
"jsx": "react",
"allowJs": true,
"moduleResolution": "node"
}
}
查看 TypeScript 官方文檔 了解更多關(guān)于 tsconfig.json 的配置選項(xiàng)。
想要了解 webpack 配置的更多信息,請(qǐng)查看 配置 概念。
現(xiàn)在,配置 webpack 處理 TypeScript:
webpack.config.js
const path = require('path');
module.exports = {
entry: './src/index.ts',
module: {
rules: [
{
test: /\.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/,
},
],
},
resolve: {
extensions: ['.tsx', '.ts', '.js'],
},
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
},
};
這會(huì)讓 webpack 直接從 ./index.ts 進(jìn)入,然后通過(guò) ts-loader 加載所有的 .ts 和 .tsx 文件,并且在當(dāng)前目錄輸出一個(gè) bundle.js 文件。
現(xiàn)在讓我們改變 lodash 在 ./index.ts 文件中的引入, 因?yàn)樵?nbsp;lodash 的定義中沒(méi)有默認(rèn)(default)的導(dǎo)出。
./index.ts
- import _ from 'lodash';
+ import * as _ from 'lodash';
function component() {
const element = document.createElement('div');
element.innerHTML = _.join(['Hello', 'webpack'], ' ');
return element;
}
document.body.appendChild(component());
在本指南中,我們使用 ts-loader,因?yàn)樗軌蚝芊奖愕貑⒂妙~外的 webpack 功能,例如將其他 web 資源導(dǎo)入到項(xiàng)目中。
請(qǐng)注意,如果您已經(jīng)在使用? babel-loader
? 來(lái)轉(zhuǎn)譯您的代碼,您可以使用? @babel/preset-typescript
? 來(lái)讓Babel處理您的JavaScript和TypeScript文件,而無(wú)需使用額外的加載器。請(qǐng)記住,與ts-loader相反,底層的 @babel/plugin-transform-typescript
? 插件不會(huì)執(zhí)行任何類(lèi)型檢查。
想要了解 source map 的更多信息,請(qǐng)查看 開(kāi)發(fā) 指南。
想要啟用 source map,我們必須配置 TypeScript,以將內(nèi)聯(lián)的 source map 輸出到編譯后的 JavaScript 文件中。必須在 TypeScript 配置中添加下面這行:
tsconfig.json
{
"compilerOptions": {
"outDir": "./dist/",
+ "sourceMap": true,
"noImplicitAny": true,
"module": "commonjs",
"target": "es5",
"jsx": "react",
"allowJs": true,
"moduleResolution": "node",
}
}
現(xiàn)在,我們需要告訴 webpack 提取這些 source map,并內(nèi)聯(lián)到最終的 bundle 中。
webpack.config.js
const path = require('path');
module.exports = {
entry: './src/index.ts',
+ devtool: 'inline-source-map',
module: {
rules: [
{
test: /\.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/,
},
],
},
resolve: {
extensions: [ '.tsx', '.ts', '.js' ],
},
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
},
};
查看 devtool 文檔以了解更多信息。
你可以在 TypeScript 代碼中使用 webpack 特定的特性,比如 import.meta.webpack。并且 webpack 也會(huì)為它們提供類(lèi)型支持,只需要添加一個(gè) TypeScript reference 聲明:
/// <reference types="webpack/module" />
console.log(import.meta.webpack); // 沒(méi)有上面的聲明的話(huà),TypeScript 會(huì)拋出一個(gè)錯(cuò)誤
在從 npm 安裝 third party library(第三方庫(kù)) 時(shí),一定要記得同時(shí)安裝此 library 的類(lèi)型聲明文件(typing definition)。你可以從 TypeSearch 中找到并安裝這些第三方庫(kù)的類(lèi)型聲明文件。
舉個(gè)例子,如果想安裝 lodash 類(lèi)型聲明文件,我們可以運(yùn)行下面的命令:
npm install --save-dev @types/lodash
想了解更多,可以查看 這篇文章。
想要在 TypeScript 中使用非代碼資源(non-code asset),我們需要告訴 TypeScript 推斷導(dǎo)入資源的類(lèi)型。在項(xiàng)目里創(chuàng)建一個(gè) ?custom.d.ts
? 文件,這個(gè)文件用來(lái)表示項(xiàng)目中 TypeScript 的自定義類(lèi)型聲明。我們?yōu)?nbsp;.svg 文件設(shè)置一個(gè)聲明:
custom.d.ts
declare module '*.svg' {
const content: any;
export default content;
}
H 這里,我們通過(guò)指定任何以 .svg 結(jié)尾的導(dǎo)入(import),將 SVG 聲明(declare) 為一個(gè)新的模塊(module),并將模塊的 content 定義為 any。我們可以通過(guò)將類(lèi)型定義為字符串,來(lái)更加顯式地將它聲明為一個(gè) url。同樣的概念適用于其他資源,包括 CSS, SCSS, JSON 等。
關(guān)于構(gòu)建工具,請(qǐng)查看 構(gòu)建性能 指南。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話(huà):173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: