vscode安装swift插件_使用 Webpack 优化 VS Code 插件加载性能

7da4092b99a33b02414f2124740b5ad8.png

Webpack 这一 JS 模块打包神器相信大家都不陌生了。由于 VS Code 插件大部分也都是 JS/TS 代码 + 依赖库的形式,因此也可以使用 Webpack 打包,优化性能。

经过实测,经过 Webpack 打包优化后的插件,其加载耗时可缩短几倍甚至数十倍之多,先来看下效果:

Webpack 优化效果

我们以 Java Test Runner 这一插件为例:

在使用 Webpack 后,安装包的大小由原先的 9.8M 缩减到了 1.9M (在这其中还包含了一些 .jar 文件,真正的 extension.js 在解压后,仅为 900KB 左右)。

性能上,我们利用 VS Code 自带的性能检测工具查看插件加载所用的时间,在我的电脑上,Java Test Runner 的加载时间由原先的 2000ms 缩短到了 200ms 左右,前后相差近 10 倍,可以说效果非常显著了。

VS Code 插件的开发者们不妨尝试一下 Webpack 为自己插件所带来的惊喜!下面就来聊聊如何将 Webpack 应用到自己的插件项目当中吧!

增加 Webpack 相关依赖库

npm install --save-dev webpack webpack-cli ts-loader
使用 ts-loader 是由于我的插件是基于 TypeScript 编写的。

添加 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-loaderresolve: {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"。 不要忘记将 dist 目录添加到 .gitignore 中。

优化开发体验

另外,我们可以更新开发插件时所用的 Launch Configuration 来优化开发体验:

更新 launch.json

launch.json 文件存放了我们平时调试插件时的配置信息:

{"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 任务:

"scripts:" {..."watch": "webpack --mode development --watch --info-verbosity verbose"...
}

这里我们让 Webpack 以 watch 模式监听我们对代码的修改,并实时地对代码进行打包,并让其以 verbose 模式输出更多的打包信息。这是为什么呢?因为我们可以利用这些输出信息让 VS Code 知道打包已经完成了。

为了做到这一点,我们需要在 task.json 中创建一个监听输出的任务,这样就可让 VS Code 在 Webpack 完成打包后,自动启动我们的插件进行调试:

{"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": "Compilations+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 放入安装包当中了,这将极大缩小安装包的大小。

最后

VS Code Team 官方提供了使用 Webpack 的样例代码,感兴趣的读者可以直接查看。

最后的最后

打一波小小的广告。我们 Visual Studio China Team 目前致力于提供可与 Eclipse & IntelliJ 媲美的 VS Code Java 开发体验,目前已经发布了一些 VS Code 中的 Java 开发插件。所有项目均为开源项目,欢迎有兴趣的读者下载试用:

  • Language Support for Java™ by Red Hat
  • Debugger for Java
  • Java Test Runner
  • Maven Project Explorer
  • Java Dependency Viewer

可以通过提 Issue 的方式给我们提出修改建议,喜欢的话也可以打 ⭐️支持哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502808.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全国战争linux添加eth0,linux服务器双线路接入配置

linux服务器双线路接入配置现在有两个专线外接进来分别是移动IP:218。204。242。XXX和电信IP:124。172。245。XXX服务器的地址eth0和eth1的地址分别是:移动IP:218。204。242。XXX和电信IP:124。172。245。XXXDEVICEeth…

c++rpg黑框游戏_NO总本色出演断智大师兄,电竞魔音主C人《超级猎杀》一战成名...

谁说没有智力不能玩RPG?近日,一款名为《超级猎杀》的生存RPG地图在诸多暴雪主播的相继挑战下进入了玩家们的眼帘,要说其中哪位的操作堪称"迷幻"之最,或许No总排第二没人敢称第一。这位菜的同时又自诩无敌的"断智法…

linux 命令行模式自动登录,实现linux的自动登录--命令行模式启动

linux的登录主要是由两个文件在控制,/usr/sbin/getty来获得用户名,并进行检查用户名是否存在,然后将用户名传递给/usr/bin/login来获取用户输入密码和检查密码是否正确.所以要实现linux的自动登录,就要改动这两个文件.1.getty实现的主要功能是:1)打开指定的tty;2)提示用户登录(…

centos7 修改为任意网卡名_centos7首次启动需要配置的内容

前言用户需安装centos图形化界面或命令行界面安装centos7命令行界面,我为大家整理好了,请点击以下链接,亲测N次没问题!![https://blog.csdn.net/zkzbhh/article/details/78145708](https://blog.csdn.net/zkzbhh/artic…

python将图片存入数据库_使用python把图片存入数据库

一般情况下我们是把图片存储在文件系统中,而只在数据库中存储文件路径的,但是有时候也会有特殊的需求:把图片二进制存入数据库。今天我们采用的是pythonmysql的方式MYSQL 是支持把图片存入数据库的,也相应的有一个专门的字段 BLOB…

linux播放到设备,linux - 将字节流式传输到ALSA播放设备 - 堆栈内存溢出

我在使用libasound将随机字节写入ALSA播放设备时遇到了很多麻烦。 最终,我的目标是能够通过网络路由回放流并让它在远程设备上播放。此问题中提供的代码将WAV文件读入内存并通过snd_pcm_writei将其写入驱动程序并且可以正常工作。 但是,这段代码与我正在…

vue实现一个带搜索功能的列表_(Vue起步)2.模板指令:v-for / v-on / v-model

①公众号:王酱酱记②记录跟着文档学习Vue的一些关键点,持续更新。感兴趣的小白建议关注一下③Vue当中有几个常见的指令,看看是怎么用的,强烈建议你自己在编辑器里打一遍,你就更明白Vue为什么是数据驱动型的一款框架啦&…

python读取windows日志_Python解析windows系统日志文件

DOM是Document Object Model的简称,XML 文档的高级树型表示。该模型并非只针对 Python,而是一种普通XML 模型。Python 的 DOM 包是基于 SAX 构建的,并且包括在 Python 2.0 的标准 XML 支持里。参考博客:python网络编程学习笔记&am…

linux安装mysql5.5.52,Linux系统上安装MySQL 5.5prm

RapidXML 试用近半年来断断续续的封装一些SDK,在兼顾跨平台.易用性和高效率上还要顾及到对外dll的大小问题.由于之前解析SVG文件的用到了一个XML解析库xercesc,这个DLL实在巨大近4M,于是尝试用新的X ...ios数据库1. ios数据库管理软件 ios使用的数据库是sqlite 管理软件有2种, …

python numpy库安装winerror5_详解idea从git上拉取maven项目详细步骤

刚从Eclipse转Intellij,对于它的各种操作也是一脸懵逼,但觉得使用起来还不错,今天就说一下我用Idea导入git中的Maven项目的详细步骤: 1. 首先打开Intellji Idea,选择check out from Version Control,选择Git(图片上选到gitHub了,抱…

python 函数例子_Python3函数之例子

1.分别使用递归、循环和生成器求菲波那切数列递归:def fib_rec(n):if n 0:return 1if n 1:return 1return fib_rec(n-1) fib_rec(n-2)fib_rec(5)循环:def fib_loop(n):lst []for i in range(n1):if i 0 or i 1:lst.append(1)else:lst.append(lst[-…

java jcsh执行linux命令,java jcsh执行linux命令

java jcsh执行linux命令[2021-02-03 01:26:29] 简介:php去除nbsp的方法:首先创建一个PHP代码示例文件;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐&#xff…

python目标检测答案_入门指南:用Python实现实时目标检测(内附代码)

全文共6821字,预计学习时长20分钟 来源:Pexels 从自动驾驶汽车检测路上的物体,到通过复杂的面部及身体语言识别发现可能的犯罪活动。多年来,研究人员一直在探索让机器通过视觉识别物体的可能性。 这一特殊领域被称为计算机视觉 (C…

sql md5函数_【学习笔记】常见漏洞:SQL注入的利用与防御

第 21 课 SQL注入的利用与防御课程入口(付费)个人背景李,本科,电子信息工程专业,毕业一年半,有JavaScript的,PHP,Python的语言基础,目前自学网络安全中。SQL注入的利用与防御01 SQL盲注1.1 S…

管理linux的快捷键,Linux快捷键及系统管理命令(1)

快捷键:ctrlU:快速删除光标前所有字符内容。ctrlK:快速删除从当前光标到行尾的所有字符内容。ctrlL:快速清空当前屏幕中显示的内容,只在左上角显示命令提示符。ctrlC:取消当前命令行的编辑,并切…

docker -v 覆盖了容器中的文件_浅谈docker中宿主机和容器之间互相copy文件的两种方式,欢迎补充...

在dokcer的日常使用过程中,我们可能会遇到将宿主机内文件/目录copy到容器内,或者将容器的文件/目录copy到宿主机中,下面我们就来简单的谈一下关于这种情况的两种操作。1、Docker cp命令:用于容器与主机之间的数据copy语法&#xf…

线性代数第九版pdf英文_斯坦福CS229机器学习课程的数学基础(线性代数)翻译完成...

文章转载自公众号 机器学习初学者 , 作者 机器学习初学者Stanford cs229 manchine learning课程,相比于Coursera中的机器学习有更多的数学要求和公式的推导,课程全英文,基础材料部分还没有翻译。这个基础材料主要分为线性代数和概…

用python读取股票价格_Python读取文件并给出股票价格

我使用的是ystockquote,可以找到here。基本上,我有一个包含我所有股票符号的文件,然后我用python将其笔下并显示每只股票的价格。以下是我目前为止的代码:import ystockquote def intro(): # Here you enter the name of your fil…

ppc linux 性能,用profile和oprofile监视视linux性能!

profile使用:profile功能是架构无关的,可以用来监视linux内核的4项功能,即:11 #define CPU_PROFILING 112 #define SCHED_PROFILING 213 #define SLEEP_PROFILING 314 #define KVM_PROFILING 4要想找开profile功能&#xff0c…

bisect git 使用_Git使用过程中的一些常见场景问题总结

之前在公司内部推Git,写了一份git使用教程,后来又在团队内部做了一次分享,内容是关于Git使用过程中经常会遇到的一些场景,并有了这份总结。git基础基于feature的工作流添加忽略文件 .gitignore (http://gitignore.io/)基于develop…