SPONSORS 赞助商
Vue.js
渐进式JavaScript框架
your logo
现在光能用TypeScript
写代码还不行,还得让Webpack
支持TS转JS才行。
之前我们ES6转ES5时是让Webpack
通过Babel
配置来转换,这次TypeScript
也可以通过Babel
配置给Webpack
转换。
npm i -D @babel/preset-typescript
// babel.config.js
module.exports = {
presets: [
[
"@babel/preset-env", // ES
{
targets: {
browsers: ["> 0.25%", "not dead"],
},
},
],
[
"@babel/preset-typescript", // TS
],
],
};
对应的Webpack配置入口
和babel-loader解析后缀
都需要修改。
// webpack.base.js
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
entry: {
index: path.resolve(__dirname, "../src/index.ts"),
},
output: {
path: path.resolve(__dirname, "../dist"),
},
plugins: [
new HtmlWebpackPlugin({
template: path.resolve(__dirname, "../public/index.html"),
favicon: path.resolve(__dirname, "../public/logo.svg"),
}),
],
module: {
rules: [
{
test: /\.(js|ts)$/,
exclude: /node_modules/,
use: {
loader: "babel-loader"
},
},
],
},
};
到这里再去执行npm run build
就会发现构建没有问题了。
前面使用@babel/preset-typescript
进行转换的方式的优点在于构建效率快,但缺点是缺少类型检查。
为了兼容不同的使用人群,这边也介绍下使用ts-loader
的方式,优点是具有类型检查,缺点则是构建效率较慢。
npm i -D ts-loader
// webpack.base.js
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
entry: {
index: path.resolve(__dirname, "../src/index.ts"),
},
output: {
path: path.resolve(__dirname, "../dist"),
},
plugins: [
new HtmlWebpackPlugin({
template: path.resolve(__dirname, "../public/index.html"),
favicon: path.resolve(__dirname, "../public/logo.svg"),
}),
],
module: {
rules: [
{
// test: /\.(js|ts)$/,
test: /\.(js)$/,
exclude: /node_modules/,
use: {
loader: "babel-loader"
},
},
{
test: /\.tsx?$/,
loader: 'ts-loader',
exclude: /node_modules/,
options: {
configFile: path.resolve(process.cwd(), 'tsconfig.json')
},
},
],
},
};
npm run dev # 构建看看效果
这个时候我们再尝试写下错误的类型,就会看到终端会出现报错信息。
// src/index.ts
interface Test {
a: number;
b: string;
c: string;
}
const test: Test = {
a: 111,
b: "111",
};
console.log(test);
最后总结下,这里我们介绍了两种方式来转换TS:
@babel/preset-typescript
这种方式的好处在于构建效率快,但缺点是缺少类型检查。ts-loader
这种方式的优点是构建时会进行类型检查,但构建效率慢。提示
本项目使用的是ts-loader
具体使用哪种方式来转换TS,就看个人的取舍了,这里不做推荐。