解決 vue cli 使用 typescript 後打包巨慢的問題

前言

最近新開了一個項目,雖然用的是 vue 技術棧,可是爲了項目的健壯性,仍是強上了 typescript, 因而引出了下面的問題。vue

問題

以前使用過 ts-loader 打包 react 項目,給個人感受就是巨慢,開發環境下,每次保存後,須要等10秒鐘左右才能構建完成,當時爲了解決這個問題,把 ts-loader 替換成了 babel 的 typescript 插件,結果是很是的快,每次保存一秒中以內就能完成構建。此次在 vue 中使用 typescript,開發環境下還算快,可是構建生產包時,進程都可以被卡死,體驗很是糟糕,接下來說解如何替換 typescript 構建工具。node

替換 ts-loader

修改 vue webpack 配置以前,咱們須要知道 vue 是如何配置 ts-loader的,運行以下代碼,輸出 webpack 配置文件:react

vue inspect > output.jswebpack

打開 output.js 搜索 ts-loader,能夠看到以下配置:web

/* config.module.rule('ts') */
{
    test: /\.ts$/,
    use: [
    /* config.module.rule('ts').use('cache-loader') */
    {
        loader: 'cache-loader',
        options: {
        cacheDirectory: '/Users/edz/Desktop/project/senguo/cashier-admin/node_modules/.cache/ts-loader',
        cacheIdentifier: 'aee3033a'
        }
    },
    /* config.module.rule('ts').use('babel-loader') */
    {
        loader: 'babel-loader'
    },
    /* config.module.rule('ts').use('ts-loader') */
    {
        loader: 'ts-loader',
        options: {
        transpileOnly: true,
        appendTsSuffixTo: [
            '\\.vue$'
        ],
        happyPackMode: false
        }
    }
    ]
},
/* config.module.rule('tsx') */
{
    test: /\.tsx$/,
    use: [
    /* config.module.rule('tsx').use('cache-loader') */
    {
        loader: 'cache-loader',
        options: {
        cacheDirectory: '/Users/edz/Desktop/project/senguo/cashier-admin/node_modules/.cache/ts-loader',
        cacheIdentifier: 'aee3033a'
        }
    },
    /* config.module.rule('tsx').use('babel-loader') */
    {
        loader: 'babel-loader'
    },
    /* config.module.rule('tsx').use('ts-loader') */
    {
        loader: 'ts-loader',
        options: {
        transpileOnly: true,
        happyPackMode: false,
        appendTsxSuffixTo: [
            '\\.vue$'
        ]
        }
    }
    ]
}
複製代碼

能夠看到使用到了 ts-loader, 同時還使用到了 babel, 這卻是爲咱們後期的配置提供了很多方便。typescript

首先刪除 ts-loader 的配置,由於 vue webpack 的配置使用的是 webpack-chain,因此這裏也須要用到這個工具才能進行修改,代碼以下:babel

// vue.config.js

module.exports = {
    chainWebpack: config => {
        config.module.rule('ts').uses.delete('ts-loader')
        config.module.rule('tsx').uses.delete('ts-loader')
    }
}
複製代碼

接着安裝 babel 的 typescript 插件app

yarn add @babel/preset-typescript @babel/plugin-transform-typescript工具

而後修改 babel.config.js 以下:ui

module.exports = {
    presets: [
        '@vue/app',
        "@babel/preset-typescript"
    ],
    plugins: [
        "@babel/plugin-transform-typescript"
    ]
}

複製代碼

若是你在代碼中使用到了 jsx, 那麼可能還須要添加以下配置項,反正我是遇到了解析 jsx 出錯的問題。

module.exports = {
    presets: [
        '@vue/app',
        ["@babel/preset-typescript", {
            "allExtensions": true,
            "isTSX": true
        }],
    ],
    plugins: [
        "@babel/plugin-transform-typescript"
    ]
}

複製代碼

最後再打包,嗯~ 比以前快多了!

相關文章
相關標籤/搜索