本次给大家带来的分享是关于VS Code插件的一些经验,分享的内容是我写的一个插件:view-readme。
开发背景
在本地安装好所有npm包后,有的时候想看看某个模块的文档,了解其特性以及如何使用。于是打开node_modules文件夹,大家都知道,这个文件夹里面的文件是非常多的,很难定位到我们想看的模块,并且这么多的目录树展开后,严重影响到编辑的使用。
为了解决上面这个问题,我开发了view-readme
这个插件。在任何时候你想查看npm包的文档时,按快捷键并输入想要查看的模块名称,自动为你打开该模块的README.md文档。
环境准备
1.安装Yeoman和VS Code脚手架
npm install -g yo generator-code
2.生成项目模版
yo code
3.配置选项
选择第二项(JavaScript)
扩展名称
扩展唯一标识
扩展描述
发布作者
是否创建git仓库
4.模版目录
.
|____.eslintrc.json
|____.gitignore
|____.vscode // vscode配置目录
| |____extensions.json
| |____launch.json
| |____settings.json
|____.vscodeignore // 发布时过滤掉的文件
|____CHANGELOG.md // 发布记录
|____extension.js // 插件入口
|____jsconfig.json // js规则
|____package.json // 资源配置
|____README.md // 文档
|____test // 自动化测试目录
| |____extension.test.js
| |____index.js
|____vsc-extension-quickstart.md
5.运行
打开新窗口
加载插件目录
进入调试
Launch Extension
打开命令面板(cmd+shift+p)
输入hello world,回车
弹窗Hello World提示
插件代码
资源配置介绍
{
"name": "vscode-view-readme",
"displayName": "view-readme",
"description": "Open readme.md at nearly path of node_modules quickly. ",
"version": "0.1.3",
"publisher": "ansenhuang",
"icon": "images/logo128.png",
"engines": {
"vscode": "^1.10.0"
},
"galleryBanner": { // 发布后的预览页配置
"color": "#eff1f3", // banner颜色
"theme": "light" // 主题(light, dark)
},
"categories": [
"Other" // 插件分类
],
"activationEvents": [ // 启动项
"onCommand:viewReadme.showLocal" // 触发这个命令时启动
],
"main": "./src/extension", // 插件入口
"contributes": { // 配置
"configuration": { // 定义默认参数
"type": "object",
"title": "View readme configuration",
"properties": { // 这里定义的参数可以在vscode中取到
"view-readme.savePath": {
"type": "string",
"default": "",
"description": "Save in local path when request remote."
},
"view-readme.npmUrl": {
"type": "string",
"default": "https://registry.npmjs.org/",
"description": "Get data from remote url."
}
}
},
"commands": [ // 命令配置
{
"command": "viewReadme.showLocal", // 注册的命令
"title": "Readme: Open markdown file" // 命令显示在面板的标题
}
],
"keybindings": [ // 快捷键配置
{
"command": "viewReadme.showLocal", // 要触发的命令
"key": "ctrl+shift+l", // windows系统的快捷键
"mac": "cmd+shift+l" // mac系统的快捷键
}
]
},
"scripts": {
"postinstall": "node ./node_modules/vscode/bin/install"
},
"devDependencies": {
"@types/mocha": "^2.2.32",
"@types/node": "^6.0.40",
"eslint": "^3.6.0",
"mocha": "^2.3.3",
"typescript": "^2.0.3",
"vscode": "^1.0.0"
}
}
src/extension.js
var vscode = require('vscode');
var Local = require('./Local');
var { INPUT_PROMPT } = require('./config');
function activate (context) {
// 注册命令
var disposableLocal = vscode.commands.registerCommand('viewReadme.showLocal', function () {
vscode.window.showInputBox({ // 调出输入框
prompt: INPUT_PROMPT
}).then(function (moduleName) {
new Local(moduleName); // 回车后执行
});
});
context.subscriptions.push(disposableLocal);
}
function deactivate () {}
// exports
exports.activate = activate;
exports.deactivate = deactivate;
src/Local.js
var fs = require('fs');
var path = require('path');
var vscode = require('vscode');
var {
MARKDOWN_PREVIEW,
README_NAMES,
NO_FILE,
NOT_FOUND
} = require('./config');
function Local (moduleName) {
this.moduleName = moduleName;
moduleName && this.init();
}
Local.prototype = {
init: function () {
var files = vscode.workspace.textDocuments; // 获取当前打开的文件路径
if (files.length) {
var last = files.length - 1;
this.handlePath(path.dirname(files[last].fileName)); // 取最后打开的文件目录,基于这个路径去查找node_modules目录
} else {
vscode.window.showInformationMessage(NO_FILE); // 弹出提示信息
}
},
handlePath: function (dir) {
if (dir === '/') { // 已到达根目录
vscode.window.showInformationMessage(NOT_FOUND);
return;
}
var modulePath = path.join(dir, 'node_modules', this.moduleName);
if (fs.existsSync(modulePath)) {
this.handleReadme(modulePath); // 找到了模块目录
} else {
this.handlePath(path.dirname(dir)); // 未找到则继续向上查找
}
},
handleReadme: function (modulePath) {
var readmeName = README_NAMES.find(function (name) {
return fs.existsSync(path.join(modulePath, name));
});
if (readmeName) {
var readmePath = path.join(modulePath, readmeName);
vscode.commands.executeCommand(MARKDOWN_PREVIEW, vscode.Uri.parse('file://' + readmePath)); // 执行markdown命令,打开文件
} else {
vscode.window.showInformationMessage(NOT_FOUND);
}
}
};
module.exports = Local;
src/config.js
exports.MARKDOWN_PREVIEW = 'markdown.showPreview';
exports.README_NAMES = ['README.md', 'readme.md', 'Readme.md', 'README', 'readme'];
exports.INPUT_PROMPT = 'Enter module name';
exports.NO_FILE = 'Please open file firstly.';
exports.NOT_FOUND = 'Module not found!';
插件编写完成,重新运行一下试试效果吧。
发布插件
账号
Create new account
添加Personal Access Token(地址:https://[your name].visualstudio.com/_details/security/tokens,注意Token只显示一次,最好自己保存一份)
发布工具
安装
npm install -g vsce
创建发布作者
vsce create-publisher (publisher name)
发布
vsce publish
打包成二进制文件
vsce package
结尾
大家可以在VS Code插件中搜索view-readme
来安装这个插件。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。