使用 Webapck 優化 VS Code 插件加載性能

Webpack 這一 JS 模塊打包神器相信你們都不陌生了。因爲 VS Code 插件大部分也都是 JS/TS 代碼 + 依賴庫的形式,所以也可使用 Webpack 打包,優化性能。javascript

VS Code 插件的開發者們不妨嘗試一下 Webpack 爲本身插件所帶來的驚喜!java

增長 Webpack 相關依賴庫

npm install --save-dev webpack webpack-cli ts-loader
複製代碼

使用 ts-loader 是因爲個人插件是基於 TypeScript 編寫的。node

添加 Webpack 配置文件

//@ts-check
 'use strict';

const path = require('path');

/**@type {import('webpack').Configuration}*/
const config = {
    // VS Code 插件運行於 Node.js 上下文中
    // 📖 -> https://webpack.js.org/configuration/node/
    target: 'node',
    node: {
        __dirname: false,
        __filename: false,
    },
    // 插件的運行入口。
    // 📖 -> https://webpack.js.org/configuration/entry-context/
    entry: './src/extension.ts',
    // 咱們將打包後的文件保存於 'dist' 目錄下
    // 📖 -> https://webpack.js.org/configuration/output/
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'extension.js',
        libraryTarget: "commonjs2",
        devtoolModuleFilenameTemplate: "../[resource-path]",
    },
    externals: {
        // 'vscode'模塊由 VS Code 運行時提供,能夠將其排除避免打包文件過大
        // 📖 -> https://webpack.js.org/configuration/externals/
        vscode: "commonjs vscode",
    },
    devtool: 'source-map',
    // 解析 TypeScript 和 JavaScript 文件
    // 📖 -> https://github.com/TypeStrong/ts-loader
    resolve: {
        extensions: ['.ts', '.js'],
    },
    module: {
        rules: [{
            test: /\.ts$/,
            exclude: /node_modules/,
            use: [{
                loader: 'ts-loader',
            }]
        }]
    },
}
module.exports = config;
複製代碼

因爲咱們會使用打包後的輸出文件做爲插件的代碼,所以務必要記得修改 package.json 中的插件主程序入口,例如:"main": "./out/src/extension" 修改成 "main": "./dist/extension"webpack

不要忘記將 dist 目錄添加到 .gitignore 中。git

優化開發體驗

另外,咱們能夠更新開發插件時所用的 Launch Configuration 來優化開發體驗。github

更新 launch.json

launch.json 文件存放了咱們平時調試插件時的配置信息:web

{
    "version": "0.1.0",
    "configurations": [
        {
            "name": "Launch Extension",
            "type": "extensionHost",
            "request": "launch",
            "runtimeExecutable": "${execPath}",
            "args": ["--extensionDevelopmentPath=${workspaceRoot}" ],
            "stopOnEntry": false,
            "sourceMaps": true,
            // 注意這裏須要使用 Webpack 的輸出文件路徑。
            "outFiles": [ "${workspaceRoot}/dist/**/*.js" ],
            // 在 Launch 以前的前置任務,定義見下文。
            "preLaunchTask": "npm: watch"
        }
    ]
}
複製代碼

定義 npm:watch 並建立 tasks.json

首先咱們在 package.json 中定義 watch 任務:typescript

"scripts:" {
    ...
    "watch": "webpack --mode development --watch --info-verbosity verbose"
    ...
}
複製代碼

這裏咱們讓 Webpack 以 watch 模式監聽咱們對代碼的修改,並實時地對代碼進行打包,並讓其以 verbose 模式輸出更多的打包信息。這是爲何呢?由於咱們能夠利用這些輸出信息讓 VS Code 知道打包已經完成了。npm

爲了作到這一點,咱們須要在 task.json 中建立一個監聽輸出的任務,這樣就可以讓 VS Code 在 Webpack 完成打包後,自動啓動咱們的插件進行調試:json

{
    "version": "2.0.0",
    "tasks": [
        {
            // 定義 npm: watch
            "type": "npm",
            "script": "watch",
            "problemMatcher": {
                "owner": "typescript",
                "pattern":[
                    {
                        "regexp": "\\[tsl\\] ERROR",
                        "file": 1,
                        "location": 2,
                        "message": 3
                    }
                ],
                "background": {
                    "activeOnStart": true,
                    // 經過對 Webpack 的輸出內容進行匹配,得知編譯是否完成
                    "beginsPattern": "Compilation \\w+ starting…",
                    "endsPattern": "Compilation\\s+finished"
                }
            },
            "isBackground": true,
            "presentation": {
                "reveal": "never"
            },
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
複製代碼

更新 vscode:prepublish 腳本

vscode:prepublish 是定義在 package.json 中的一段腳本,這段腳本會在生成 VS Code 插件安裝包以前執行:

"scripts:" {
    ...
    // 使用 VSCE 生成插件時的前置腳本,讓 Webpack 打包
    "vscode:prepublish": "webpack --mode production"
    ...
}
複製代碼

點此查看更多關於 vscode:prepublish 的介紹。

更新 .vscodeignore

相似於 .gitignore, .vscodeignore 列出了在生成 VS Code 插件安裝包時,全部不須要放入安裝包中的文件及目錄,這裏咱們能夠增長下列幾項:

  • dist/**/*.map.map 文件僅在本地調試時須要用到。
  • webpack.config.js:Webpack 的配置文件也不須要放入安裝包當中。
  • node_modules:因爲使用 Webpack 對依賴庫進行了打包,所以咱們再也不須要將 node_modules 放入安裝包當中了,這將極大縮小安裝包的大小。

效果

至此咱們就已經大功告成了,那麼使用了 Webpack 究竟能對 VS Code 插件的性能產生多大的影響呢?咱們以 Java Test Runner 爲例:

安裝包大小 加載時間
未使用 Webpack 9.8M ~2000ms
使用 Webpack 1.9M ~200ms

在使用 Webpack 後,安裝包的大小由原先的 9.8M 縮減到了 1.9M (在這其中還包含了一些 .jar 文件,真正的 extension.js 在解壓後,僅爲 900KB 左右)。

性能上,咱們利用 VS Code 自帶的性能檢測工具查看插件加載所用的時間,在個人電腦上,Java Test Runner 的加載時間由原先的 2000ms 縮短到了 200ms 左右,先後相差近 10 倍,能夠說效果很是顯著了。

若是你也是 VS Code 插件的開發者,那就不要猶豫,讓 Webpack 帶你的插件起飛吧!

最後

VS Code Team 官方提供了使用 Webpack 的樣例代碼,感興趣的童靴能夠直接查看。

最後的最後

打一波小小的廣告。咱們 Team 目前致力於一系列 VS Code 中的 Java 開發插件,全部項目均爲開源項目,歡迎有興趣的童鞋下載試用:

能夠經過提 Issue🙋的方式給咱們提出修改建議,喜歡的話也能夠打 ⭐️支持哦!

相關文章
相關標籤/搜索