草庐IT

【原子样式实践】第12篇 一次搞定微信开发者工具的原子样式扩展

张业贵说技术 2023-03-28 原文
原子样式虽好,在IDE中使用,有扩展辅助就更好。本文介绍如何开发微信开发者工具的原子样式扩展,支持原子样式的自动生成,支持特色功能组合样式,支持特色功能样式使用统计报告。


1 研发背景

(1)集成可视化和实时生成。

原子样式的规范性或者合理使用必须以统计数据为基础,需要经常查看,以便分析和优化。

页面文件编写完成后,立即生成样式文件,可实时预览。

(2)限制导致的兼容性问题

微信开发者工具是基于 Visual Studio Code 定制的,但其插件管理方式却受到限制。由于并不能清楚的知道受到哪些限制,自研可以保证兼容性最好。 

两个关键点:

(1)开发者工具可以兼容运行于 Microsoft Visual Studio Code 1.46.0+ 版本的大部分扩展。某些类别(例如调试)的扩展无法支持。

(2)注 1: 不支持直接安装 vsix 格式的插件。来自 Microsoft Visual Studio Code 已安装的扩展,其解包后的文件夹可以在 ~/.vscode/extensions (macOS 系统) 或 C:\Users\用户名\.vscode\extensions (Microsoft Windows 系统) 下找到。

官方说明参见:​编辑器扩展 | 微信开放文档 (qq.com)​

适配的过程在章节 2.4 和 3 中会说明。


2 插件开发

2.1 开发插件基础

如果完全没有开发过插件,可以通过官方的教程 ​​Your First Extension | Visual Studio Code Extension API​​ 进行初步学习。

最主要是了解 ​​package.json​​​ 文件、 ​​extension.ts​​ 文件 ,看多一点就要了解 extension api 语法。

2.2 开发插件原型

(1)安装好 nodejs,安装插件开发框架。

npm install -g yo generator-code vsce
根据向导填写好相应信息。

​yo​​​ 和 ​​generator​​​ 是代码生成工具,​​vsce​​ 是插件打包工具。

按 F5 就可以运行,这就是 hello world 了。

(2)在 package.json 中配置基本信息,包括作者、仓库信息(申请一个公开的 git 仓库)和 vscode 版本信息(参考章节1),即可发布 hello world 了。

名称和版本在发布时都会使用。

"version": "0.0.1",
"author": {
"name": "foxgst"
},
"publisher": "foxgst",
"repository": {
"type": "git",
"url": "https://gitee.com/foxgst/vscode-wxmp-atomic-css.git"
},
"bugs": {
"url": "https://gitee.com/foxgst/vscode-wxmp-atomic-css/issues"
},
"homepage": "https://gitee.com/foxgst/vscode-wxmp-atomic-css/blob/main/README.md",

2.3 定制开发节点

2.3.1 开发功能函数

(1) 统计 css 使用情况 ​​commandCount​

(2)生成完全 css 文件代码 ​​commandFullBuild​

(3)开发部分文件更新 css 文件代码 ​​commandPartiallyUpdate​

2.3.2 配置激活函数

在 extension.ts 的激活函数 ​​activate​​ 中

(1)通过 FileSystemWatcher 检测 wxml 文件改动,关联 ​​commandPartiallyUpdate​​, 实现单文件的 css 联动升级。

(2)注册命令 ​​vscode-wxmp-atomic-css.count​​​,关联 ​​commandCount​​。

(3)注册命令 ​​vscode-wxmp-atomic-css.fullBuild​​​,关联 ​​commandFullBuild​​。

(4)激活后立即执行 ​​commandFullBuild​​ ,生成全量 css 文件。


export function activate(context: vscode.ExtensionContext) {

// ...

if (vscode.workspace.workspaceFolders) {
const watchDir = vscode.workspace.workspaceFolders[0];
console.debug("watchDir", watchDir);
const fsw: vscode.FileSystemWatcher = vscode.workspace.createFileSystemWatcher(new vscode.RelativePattern(watchDir, '**'));
fsw.onDidChange(e => {
console.debug("fsw.onDidChange", e);
updateDoc("*", e);
});
fsw.onDidCreate(e => {
console.debug("fsw.onDidCreate", e);
updateDoc("+", e);
});
fsw.onDidDelete(e => {
console.debug("fsw.onDidDelete", e);
updateDoc("-", e);
});
}


// The command has been defined in the package.json file
// Now provide the implementation of the command with registerCommand
// The commandId parameter must match the command field in package.json
let disposable = vscode.commands.registerCommand('vscode-wxmp-atomic-css.helloWorld', async () => {
vscode.window.setStatusBarMessage('app.wxss updated', 1000);
});
context.subscriptions.push(disposable);


disposable = vscode.commands.registerCommand('vscode-wxmp-atomic-css.count', async () => {
vscode.window.setStatusBarMessage('[ wxmp-atomic-css ] begin to generate css usage report', 1000);
commandCount(tempDataOption);
vscode.window.setStatusBarMessage(`[ wxmp-atomic-css ] css usage report saved to css-usage-report.md`, 1000);
});
context.subscriptions.push(disposable);


disposable = vscode.commands.registerCommand('vscode-wxmp-atomic-css.fullBuild', async () => {
vscode.window.setStatusBarMessage('[ wxmp-atomic-css ] begin to build css file', 1000);
commandFullBuild(tempDataOption);
vscode.window.setStatusBarMessage(`[ wxmp-atomic-css ] css file saved to mini.wxss`, 1000);
});
context.subscriptions.push(disposable);


{
vscode.window.setStatusBarMessage('[ wxmp-atomic-css ] begin to build css file', 1000);
commandFullBuild(tempDataOption);
vscode.window.setStatusBarMessage(`[ wxmp-atomic-css ] css file saved to mini.wxss`, 1000);
}
vscode.window.setStatusBarMessage('wxmp-atomic-css actived', 5000);
}

2.3.3 配置激活事件

在 package.json 中配置激活事件,其中 onStartupFinished 表示启动后立即执行。

"activationEvents": [
"onCommand:vscode-wxmp-atomic-css.helloWorld",
"onCommand:vscode-wxmp-atomic-css.count",
"onCommand:vscode-wxmp-atomic-css.fullBuild",
"onLanguage:wxml",
"onStartupFinished"
],

2.3.4 配置命令

在 package.json 的 ​commands​​ 中配置命令,对应的命令需要在 active 函数中注册。配置完成后 ​​ctrl+shift+p​​ 呼叫搜索框按 title 搜索执行。

"commands": [
{
"command": "vscode-wxmp-atomic-css.helloWorld",
"title": "Hello World"
},
{
"command": "vscode-wxmp-atomic-css.count",
"title": "count css usage"
},
{
"command": "vscode-wxmp-atomic-css.fullBuild",
"title": "build full css file"
}
],

2.3.5 配置命令快捷键

在 package.json 的 ​​keybindings​​ 中配置快捷键,对应的命令需要在 active 函数中注册。

"keybindings": [
{
"command": "vscode-wxmp-atomic-css.helloWorld",
"key": "shift+alt+p"
},
{
"command": "vscode-wxmp-atomic-css.count",
"key": "shift+alt+c"
},
{
"command": "vscode-wxmp-atomic-css.fullBuild",
"key": "shift+alt+b"
}
],

2.3.6 配置命令菜单

在 package.json 的 ​​menus​​ 中配置菜单,对应的命令需要在 ​​active​​ 函数中注册。

启动后,可以在编辑器的右键菜单中可见,菜单名称即 ​​commands​​ 中注册的 ​​title​​。

"menus": {
"editor/context": [
{
"command": "vscode-wxmp-atomic-css.count",
"group": "wxmp-atomic-css"
},
{
"command": "vscode-wxmp-atomic-css.fullBuild",
"group": "wxmp-atomic-css"
}
]
},

2.3.7 配置自定义属性

在 package.json 的 ​​configuration​​​ 中配置属性,用户可以在 IDE 中打开设置进行修改。

"configuration": [
{
"title": "wxmp-atomic-css",
"properties": {
"css.writeToAppCss": {
"type": "boolean",
"default": false,
"description": "save mini.wxss content to app.wxss, inside mark `/* mini.wxss begin */` and `/* mini.wxss end */`"
},
"css.minify": {
"type": "boolean",
"default": false,
"description": "minify css file after generate css files, \nuse u as css variables prefix of unit, \nuse c as css variables prefix of color\nremove line chars\n remove unnecessary spaces\nreplace a color name with a single char which closed to the color name"
},
}
}
},
自定义的属性可以通过下列命令读取。

vscode.workspace.getConfiguration().get(key, defaultValue)

2.4 打包插件


(1)在 package.json 中设置 vscode 版本为 1.20.0。若按照官方文档使用 1.46.0 在安装时有不兼容的提示。

"engines": {
"vscode": "^1.20.0"
},

"devDependencies": {
"@types/vscode": "^1.20.0",
},
(2)打包插件

打包之前依旧可以按 F5 调试查看效果。

在终端执行命令生成 vsix 文件。

vsce package
如果需要发布以便其他用户使用,可以参考官方教程注册账号后发布。

当然也可以自己 fork 代码后自行编译安装。

​vscode extension for wxmp-atomic-css (gitee.com)​


3 使用插件

3.1 安装和卸载插件

(1)安装插件

安装插件时,先通过【从 VSIX 安装】安装到 Microsoft Visual Studio 中,然后在微信开发者工具中切换到扩展视图,点击【从已解包的扩展文件夹安装...】选择对应文件夹即可。

(2)卸载插件

点击插,在信息面板中点击卸载即可。

(3)更新版本

不能通过应用商店更新,需要先卸载后重新安装。


3.2 执行命令

(1)手动执行

在编辑器的右键菜单中可以点击执行命令,也可以通过快捷键执行命令。

css 使用统计报告文件名为 css-usage-report.md。

(2)编写代码文件后保存,即可调用部分更新。


4 主要功能设置

(1)是否启用压缩

启用压缩后会减少不必要的字符,缩短css 变量名称,删除空格等方式减小 css 文件的大小。压缩后样式的可读性降低。

(2)是否直接将样式保存到 app.wxss

如果保存,则会在 app.wxss 中增加 /* mini.wxss begin / 和 / mini.wxss end */ 的代码区间。

否则,会将变量保存到 var.wxss ,将样式保存到 mini.wxss,并在 app.wxss 中引用。

app.wxss 中可以适量保存重置样式、字体资源、以及其他自定义样式。


5 小结

作为开发者,开发IDE插件来提高工作效率已然是标配。本文在系列文章的基础上,将原子样式文件生成功能开发为插件,直接安装到微信开发者工具使用。开发过程相对简单,功能较为实用,大家可以根据需要进行功能拓展。


有关【原子样式实践】第12篇 一次搞定微信开发者工具的原子样式扩展的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  3. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  4. ruby - 如何使用文字标量样式在 YAML 中转储字符串? - 2

    我有一大串格式化数据(例如JSON),我想使用Psychinruby​​同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解

  5. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  6. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

    我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

  7. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  8. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  9. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  10. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

随机推荐