一 、vscode安装
进入VS Code官网:https://code.visualstudio.com
选择 DownLoad for Windows 或 选择 Mac OS版本
Stable : 稳定版
Insiders : 内测版
图文详情可参考文章 :
VS Code下载安装以及常用插件安装教程(超详细)_怎么手动下载vscode 插件-CSDN博客
nvm命令
nvm install stable ## 安装最新稳定版 node,当前是node v9.5.0 (npm v5.6.0)
nvm install <version> ## 安装指定版本,可模糊安装,如:安装v4.4.0,既可nvm install v4.4.0,又可nvm install 4.4
nvm uninstall <version> ## 删除已安装的指定版本,语法与install类似
nvm use <version> ## 切换使用指定的版本node
nvm ls ## 列出所有安装的版本
nvm ls-remote ## 列出所有远程服务器的版本(官方node version list)
nvm current ## 显示当前的版本
nvm alias <name> <version> ## 给不同的版本号添加别名
nvm unalias <name> ## 删除已定义的别名
nvm reinstall-packages <version> ## 在当前版本 node 环境下,重新全局安装指定版本号的 npm 包
二、Vs Code 插件
1、Chinese (Simplified) Language Pack
适用于 VS Code 的中文(简体)语言包
2、Code Spell Checker
拼写检查器。比如 banana 单词写错成 banane ,会提示你是否修改成 banana ,也可以将 banane 添加至检查器的字典中
3、HTML CSS Support
在编写样式表的时候,自动补全功能大大缩减了编写时间
4、JavaScript (ES6) code snippets
支持ES6语法提示
5、Mithril Emmet
一个能大幅度提高前端开发效率的一个工具,用于补全代码
6、Path Intellisense
路径提示插件
7、Vue 3 Snippets
在 Vue 2 或者 Vue 3 开发中提供代码片段,语法高亮和格式化的 VS Code 插件,能极大提高你的开发效率。
8、VueHelper
vscode最好的vue代码提示插件,不仅包括了vue2所有api,还含有vue-router2和vuex2的代码
9、Auto Close Tag
自动闭合HTML/XML标签
10、Auto Rename Tag
自动完成另一侧标签的同步修改
11、Beautify
格式化 html ,js,css(也可以不用装,用自带的也可以) 该插件官方已内置集成 废弃
12、Bracket Pair Colorizer
给括号加上不同的颜色,便于区分不同的区块,使用者可以定义不同括号类型和不同颜色
13、open in browser
vscode不像IDE一样能够直接在浏览器中打开html,而该插件支持快捷键与鼠标右键快速在浏览器中打开html文件,支持自定义打开指定的浏览器,包括:Firefox,Chrome,Opera,IE以及Safari
14、Vetur
Vue多功能集成插件,包括:语法高亮,智能提示,emmet,错误提示,格式化,自动补全,debugger。vscode官方钦定Vue插件,Vue开发者必备。
15、File Utils
File Utils插件,可以方便快捷的来创建、复制、移动、重命名文件和目录。
16、IntelliJ IDEA Keybindings
安装VSCode的插件 IntelliJ IDEA Keybindings 即可在VSCode中使用IDEA的快捷键。
三、Vs Code常用快捷键
- 取消单行注释:Ctrl + K, Ctrl + U
- 多行注释:Alt + Shift + A
- 多行注释:/* */
- 单行注释:Ctrl + K, Ctrl + C 或 Ctrl + /
- 移动行:Alt + Up/Down
- 显示/隐藏左侧目录栏:Ctrl + B
- 复制当前行:Shift + Alt + Up/Down
- 删除当前行:Shift + Ctrl + K
- 控制台终端显示与隐藏:Ctrl + (反引号)
- 查找文件/安装VS Code插件地址:Ctrl + P
- 代码格式化:Shift + Alt + F
- 新建一个窗口:Ctrl + Shift + N
- 行增加缩进:Ctrl + [
- 行减少缩进:Ctrl + ]
- 裁剪尾随空格:Ctrl + Shift + X
- 字体放大/缩小:Ctrl + (+) 或 (-)
- 拆分编辑器:Ctrl + 1/2/3
- 切换窗口:Ctrl + Shift + Left/Right
- 关闭编辑器窗口:Ctrl + W
- 关闭所有窗口:Ctrl + K, Ctrl + W
- 切换全屏:F11
- 自动换行:Alt + Z
- 显示Git:Ctrl + Shift + G
- 全局查找文件:Ctrl + Shift + F
- 显示相关插件的命令(如:git log):Ctrl + Shift + P
四、VsCode 支持多语言(i18n) 国际化
1. 创建语言包文件
在你的插件项目中,创建一个 i18n 目录,用于存放不同语言的翻译文件。每种语言会对应一个单独的 JSON 文件,比如 en.json(英文)和 zh-cn.json(中文)。
en.json
{
"helloWorld": "Hello, World!",
"greeting": "Welcome to our VSCode extension!"
}
zh-cn.json
{
"helloWorld": "你好,世界!",
"greeting": "欢迎使用我们的 VSCode 插件!"
}
完整示例
├── .vscode
│ ├── tasks.json
│ └── launch.json
├── .gitignore
├── README.md
├── package.json
├── src
│ ├── extension.ts
│ └── i18n
│ ├── en.json
│ └── zh-cn.json
├── tsconfig.json
└── vsc-extension-quickstart.md
2. 加载语言包
接下来,我们需要在插件代码中加载这些语言包。可以在 extension.js 或 extension.ts 中实现这一功能。
extension.ts
import * as vscode from 'vscode';
import * as path from 'path';
import * as fs from 'fs';
function loadMessageBundle(locale: string) {
const filePath = path.join(__dirname, 'i18n', `${locale}.json`);
if (fs.existsSync(filePath)) {
return JSON.parse(fs.readFileSync(filePath, 'utf8'));
} else {
// Default to English if locale file is not found
return JSON.parse(fs.readFileSync(path.join(__dirname, 'i18n', 'en.json'), 'utf8'));
}
}
export function activate(context: vscode.ExtensionContext) {
const locale = vscode.env.language; // Get the current language setting of VSCode
const messages = loadMessageBundle(locale);
let disposable = vscode.commands.registerCommand('extension.helloWorld', () => {
vscode.window.showInformationMessage(messages['helloWorld']);
});
context.subscriptions.push(disposable);
}
export function deactivate() {}
3. 更新 package.json
最后,我们需要更新 package.json 文件,声明插件的语言包配置。
{
"contributes": {
"localizations": [
{
"languageId": "en",
"languageName": "English",
"translations": [
{
"id": "en",
"path": "./i18n/en.json"
}
]
},
{
"languageId": "zh-cn",
"languageName": "Chinese (Simplified)",
"translations": [
{
"id": "zh-cn",
"path": "./i18n/zh-cn.json"
}
]
}
]
}
}
4.动态切换语言
修改 extension.ts
首先,我们需要修改 extension.ts 文件,以支持动态加载语言包。
import * as vscode from 'vscode';
import * as path from 'path';
import * as fs from 'fs';
let currentLocale: string = vscode.env.language;
let messages: { [key: string]: string };
function loadMessageBundle(locale: string) {
const filePath = path.join(__dirname, 'i18n', `${locale}.json`);
if (fs.existsSync(filePath)) {
return JSON.parse(fs.readFileSync(filePath, 'utf8'));
} else {
return JSON.parse(fs.readFileSync(path.join(__dirname, 'i18n', 'en.json'), 'utf8'));
}
}
function refreshMessages() {
messages = loadMessageBundle(currentLocale);
}
export function activate(context: vscode.ExtensionContext) {
refreshMessages();
let disposable = vscode.commands.registerCommand('extension.helloWorld', () => {
vscode.window.showInformationMessage(messages['helloWorld']);
});
let changeLocaleCommand = vscode.commands.registerCommand('extension.changeLocale', async () => {
const picked = await vscode.window.showQuickPick(['en', 'zh-cn'], {
placeHolder: 'Select a language'
});
if (picked) {
currentLocale = picked;
refreshMessages();
vscode.window.showInformationMessage(messages['greeting']);
}
});
context.subscriptions.push(disposable, changeLocaleCommand);
}
export function deactivate() {}
借助 VSCode API 实现这一功能
5.更新 package.json
通过命令面板切换语言,我们需要在 package.json 中添加相应的命令配置
{
"contributes": {
"commands": [
{
"command": "extension.helloWorld",
"title": "Hello World"
},
{
"command": "extension.changeLocale",
"title": "Change Language"
}
],
"localizations": [
{
"languageId": "en",
"languageName": "English",
"translations": [
{
"id": "en",
"path": "./i18n/en.json"
}
]
},
{
"languageId": "zh-cn",
"languageName": "Chinese (Simplified)",
"translations": [
{
"id": "zh-cn",
"path": "./i18n/zh-cn.json"
}
]
}
]
}
}
6.使用 TypeScript 类型定义
为了编写更健壮的代码,我们可以为语言包定义一个类型,并在加载语言包时进行类型检查。
定义类型
interface Messages {
helloWorld: string;
greeting: string;
}
修改 loadMessageBundle 函数
function loadMessageBundle(locale: string): Messages {
const filePath = path.join(__dirname, 'i18n', `${locale}.json`);
if (fs.existsSync(filePath)) {
return JSON.parse(fs.readFileSync(filePath, 'utf8')) as Messages;
} else {
return JSON.parse(fs.readFileSync(path.join(__dirname, 'i18n', 'en.json'), 'utf8')) as Messages;
}
}
使用 messages 对象时,TypeScript 会帮助我们进行类型检查,确保代码的可靠性
7.处理复杂的翻译需求
实际应用中,翻译内容可能不仅仅是简单的字符串,还会涉及变量和占位符。我们可以使用较为成熟的 i18n 库来处理这些复杂的翻译需求。例如,使用 i18n 或 i18next 库
使用 i18n
首先,安装 i18n 库:
npm install i18n
配置 i18n
import * as i18n from 'i18n';
import * as path from 'path';
i18n.configure({
locales: ['en', 'zh-cn'],
directory: path.join(__dirname, 'i18n'),
defaultLocale: 'en',
extension: '.json',
register: global
});
function setLocale(locale: string) {
i18n.setLocale(locale);
}
export function activate(context: vscode.ExtensionContext) {
setLocale(vscode.env.language);
let disposable = vscode.commands.registerCommand('extension.helloWorld', () => {
vscode.window.showInformationMessage(__('helloWorld'));
});
let changeLocaleCommand = vscode.commands.registerCommand('extension.changeLocale', async () => {
const picked = await vscode.window.showQuickPick(['en', 'zh-cn'], {
placeHolder: 'Select a language'
});
if (picked) {
setLocale(picked);
vscode.window.showInformationMessage(__('greeting'));
}
});
context.subscriptions.push(disposable, changeLocaleCommand);
}
export function deactivate() {}
修改语言包格式
i18n 库要求语言包文件的格式与之前有所不同:
en.json
{
"helloWorld": "Hello, World!",
"greeting": "Welcome to our VSCode extension!"
}
zh-cn.json
{
"helloWorld": "你好,世界!",
"greeting": "欢迎使用我们的 VSCode 插件!"
}
详情图文可参考文章 :
VSCode 插件开发实战(十五):如何支持多语言_vscode i18n插件-CSDN博客
8.VSCode 和 XCode 区别
简单来说 VsCode 适用跨平台开发 支持多种开发语言
xCode 是专为苹果平台开发设计 功能非常齐全
详情可参考文章 :
五、nodejs安装
图文详情可参考文章 :
Windows、Mac安装配置Nodejs【保姆级教程】_mac安装nodejs-CSDN博客
【Vue篇】mac上Vue 开发环境搭建、运行Vue项目(保姆级)_mac vue搭建本地环境-CSDN博客
1.翻墙问题
在安装nvm时 遇到翻墙问题 打开网站 My IP | IP Address Tools | IP Geolocation | Website Traffic Checker
查询一下 raw.githubusercontent.com对应的IP 地址,然后修改本机的 hosts文件:
vim /etc/hosts
在文件中添加
185.199.108.133 raw.githubusercontent.com
2.配置nodejs(npm 国内镜像)
# 配置npm
npm config set registry https://registry.npmmirror.com #设置国内阿里云镜像源
npm config get registry #查看镜像源
npm init: 项目初始化;
npm init -y:默认一路yes,不用挨个输入信息
npm install 包名:安装js包到项目中(仅当前项目有效)。指定 包名,或者 包名@版本号
npm install -g: 全局安装,所有都能用
可以去 npm仓库 搜索第三方库
npm update 包名:升级包到最新版本
npm uninstall 包名:卸载包
npm run:项目运行
3.whistle 抓包
whistle是基于Node实现的跨平台web调试代理工具,主要用于查看、修改HTTP、HTTPS、Websocket的请求、响应,也可以作为HTTP代理服务器使用。
# 全局安装whistle抓包工具
npm install -g whistle
# Mac 或 Linux 的非 root 用户需要在命令行前面加 sudo,如:
sudo npm install -g whistle
# 如果安装超时,可以执行镜像安装
npm install whistle -g --registry=https://registry.npm.taobao.org
4.安装证书
默认端口是8899,如果端口被占用,可以在启动时通过 -p 来指定新的端口
启动以后就可以在自己的浏览器上访问到whistle的界面啦~
http://127.0.0.1:8889 打开浏览器确认服务开启成功
服务端配置证书(win10)
浏览器输入http://127.0.0.1:8889,打开whistle页面,点击HTTPS:
图文详情可参考文章 :
Windows、Mac安装配置Nodejs【保姆级教程】_mac安装nodejs-CSDN博客
5.其他常用扩展
cnpm
express
webpack
corepack
vite
pm2
vue-cli
lodash
等
项目中安装
npm install package-name
全局安装
npm install -g package-name
用法详情可参考教程 :
6.nodejs性能解析
概述 : Node.js 基于 Chrome V8引擎的开源、跨平台的JavaScript运行环境 构建快速、可扩展的网络应用程序。
性能 : 使用 事件驱动、非阻塞I/O模型 适用于实时应用、聊天应用、游戏等需要与大量用户进行实时通信的场景。处理高并发请求时表现出色。
扩展 : 采用 事件驱动的方式处理请求 主要通过 集群和负载均衡来实现横向扩展。
在技术大佬对nodejs nginx apache 的性能测试中
文章地址 : Apache、Nginx 与 Node.js 前端服务器性能对比_nodejs与apache怎么选?-CSDN博客
Apache 和 Nginx 都使用了 C 语言—— AOT 语言(编译型语言),而 Node.js 使用了 JavaScript ——这是一种 JIT 语言(解释型语言)。这意味着 Node.js 在执行程序的过程中还有额外的工作负担。
双方表现各有千秋,在实际生产环境中,可根据实际情况考虑具体使用哪种模式。
其中要考虑的点主要有 :
6.1.单线程模型的限制
虽然事件驱动的单线程模型效率很高,但CPU密集型任务可能会阻塞事件循环,降低你的Node.js应用的整体性能。如果你的应用执行大量计算,当这些任务运行时,Node.js将无法处理其他传入请求,从而导致速度变慢。
解决方案:将CPU密集型任务卸载到独立的工作线程或使用微服务在不同环境中处理这些操作
const { Worker } = require('worker_threads');
const worker = new Worker('./heavyTask.js');
worker.on('message', result => {
console.log('Result from worker:', result);
});
6.2. 内存泄漏
随着你的Node.js应用增长,未优化的代码可能会导致内存泄漏,特别是在处理大型数据集或长期运行的应用时。内存泄漏会导致内存消耗增加,使服务器变慢或在高负载下崩溃。
解决方案:使用像Chrome DevTools或node --inspect
标志这样的工具监视内存使用情况并追踪泄漏。定期检查你的应用,找出对象、变量或事件监听器可能未正确清除的位置。
6.3.优化策略
要扩展一个Node.js应用以处理数百万用户,需要结合良好的架构实践、硬件扩展和高效的资源管理。以下是一些帮助你实现这一目标的策略:
6.3.1. 使用集群进行水平扩展
默认情况下,Node.js在单个线程上运行,但你可以利用多核系统,通过使用cluster
模块运行多个实例,每个实例在一个独立核心上运行。这允许你的应用通过将负载分配到多个进程来处理更多并发用户。
示例
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello World');
}).listen(8000);
}
在这个示例中,主进程分叉出与可用CPU核心数量相等的工作进程,每个核心都可以处理请求,从而提高整体吞吐量。
6.3.2. 负载均衡
要处理数百万用户,你需要的不止一台服务器。负载均衡将传入流量分配到多台服务器上,确保没有单个服务器因请求过多而不堪重负。像NGINX、HAProxy或基于云的服务如**AWS弹性负载均衡器(ELB)**可以帮助均衡你的流量到不同实例上的Node.js应用。
6.3.3. 缓存以提升性能
反复从数据库获取相同数据或进行API调用可能会很慢。实现缓存可以帮助你更快地提供频繁请求的数据。像Redis或Memcached这样的工具可以将缓存数据存储在内存中,减少数据库负载并提高响应时间。
示例
const redis = require('redis');
const client = redis.createClient();
app.get('/data', async (req, res) => {
client.get('key', (err, data) => {
if (data) {
return res.send(JSON.parse(data));
} else {
const freshData = getFreshData(); // 从数据库或API获取数据
client.set('key', JSON.stringify(freshData), 'EX', 3600); // 缓存数据1小时
return res.send(freshData);
}
});
});
6.3.4. 数据库优化
对于许多高流量应用来说,数据库性能成为瓶颈。通过优化数据库查询、添加索引和减少每个请求查询数量,可以显著提高应用性能。
考虑实施数据库分片或读写分离架构,以便随着用户基础增长将负载分散到多个数据库上。
6.3.5.Node.js应用的真实案例
LinkedIn :LinkedIn移动服务器从Ruby on Rails切换到Node.js后,服务器数量减少了20倍,同时能够处理超过6亿用户。
Netflix :Netflix使用Node.js来处理数百万并发流,并显著减少启动时间。
Uber :Uber选择Node.js用于其高度可扩展和实时架构,这对于应对公司大量并发乘车请求至关重要。
可参考文章 : Node.js真的能处理数百万用户吗?_nodejs能抗住1000万并发-CSDN博客
7.nodejs 代码优化
7.1 回调函数
多个异步操作需要按顺序执行