本帖最后由 blake 于 2017-8-27 22:52 编辑
本次给大家带来的分享是关于VS Code插件的一些经验,分享的内容是我写的一个插件:view-readme
开发背景在本地安装好所有npm包后,有的时候想看看某个模块的文档,了解其特性以及如何使用。于是打开node_modules文件夹,大家都知道,这个文件夹里面的文件是非常多的,很难定位到我们想看的模块,并且这么多的目录树展开后,严重影响到编辑的使用。 为了解决上面这个问题,我开发了view-readme这个插件。在任何时候你想查看npm包的文档时,按快捷键并输入想要查看的模块名称,自动为你打开该模块的README.md文档。 环境准备1.安装Yeoman和VS Code脚手架 - npm install -g yo generator-code
复制代码2.生成项目模版 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!';
复制代码插件编写完成,重新运行一下试试效果吧。 发布插件账号发布工具安装 创建发布作者
- vsce create-publisher (publisher name)
复制代码发布
打包成二进制文件
结尾大家可以在VS Code插件中搜索view-readme来安装这个插件。
|