跳到主要内容

你为什么需要 husky

· 阅读需 2 分钟

你为什么需要 husky​

husky(哈士奇)一种精力和破坏力都极强的生物,混乱制造者。有一位伟大的法师说过,要用魔法来打败魔法,你需要这个 husky,帮助你避免一个不留神家被拆了。

还有一个原因是,能用工具解决的问题都使用工具解决,而非额外的人力。

如果你想要找一个项目作为参考,可以查看我的 鲜果起始页 项目

前提准备​

一个 js 项目 配置好 eslint 安装好 git

添加依赖​

安装 husky,husky 本身只提供了执行 git 对应命令时,调取对应的钩子函数,因此需要其它工具来执行对应的检查

npm i husky -D

commitlint 用于对提交内容(commit message)进行检查

npm i @commitlint/cli @commitlint/config-conventional -D

lint-staged 用于在缓冲区执行 lint,代码检查

npm i lint-staged -D

cz-git 自定义 git 提交工具

npm i cz-git czg -D

更新你的 package.json​

{
"scripts": {
"lint-staged": "lint-staged", // 该命令用于在缓冲区执行
"commit": "czg", // 之后可以使用 npm rum commit 代替 git commit -m ''
"prepare": "husky init" // 拉去依赖后,自动执行该命令
},
"config": {
"commitizen": { // 定义 commitlint 的配置
"path": "node_modules/cz-git"
}
},
"lint-staged": {
"*.{js,jsx,ts,tsx}": [ // 对以 js,jsx,ts,tsx 后缀名的文件使用 eslint --fix
"eslint --fix"
],
"*.{md,json}": [ // 对以 md,json 后缀名的文件使用 prettier --write
"prettier --write"
]
}
}

创建 husky 文件​

husky 会在 package.json 目录创建 .husky 文件,如果没有创建,可以手动创建

手动创建 .husky\commit-msg 文件,并且添加以下内容

#!/bin/sh
# . "$(dirname "$0")/_/husky.sh"

npx --no -- commitlint --edit $1

手动创建 .husky\pre-commit 文件,并且添加以下内容

#!/bin/sh
# . "$(dirname "$0")/_/husky.sh"

npm run lint-staged

echo '✅✅✅ lint pass ✅✅✅'

你可以在这些 bash 文件中自定义命令,来实现你相对应的需求

完成​

到了这里,你已经完成了在项目中添加 husky 的所有步骤,并且添加提交检查以及 git 缓冲区的检查功能

之后你可以使用 npm run commit 提交变更

性能优化清单

· 阅读需 1 分钟

加载优化​

请求​

  • 减少 Cookie 携带的数据大小
  • 避免重定向
  • 避免短时间内多次请求
  • 减少 HTTP 请求
  • 避免请求的多次往返
    • 单个文件大小有没有超过 500k
    • 将小型工具合并为一个包
    • 单个文件有没有小于 4k
    • 请求预加载

静态文件部署​

  • 静态文件 CDN
  • 压缩图像
  • 小型资源(小于 4k 直接内联到网页中减少额外请求)
  • 压缩代码
  • 提升首屏加载速度
  • 按需加载
  • 文件缓存
  • 启用 gzip
  • 预加载
  • 单独的静态文件(图像,MP4)服务器

CSS​

  • CSS 写在头部
  • 优化动画,利用 GPU 加速
  • 避免行内 style
  • 避免滥用 float
  • 减少重绘和回流

开发​

  • 减少 DOM 节点
  • 首页绘制时间(首页资源加载量)
  • 图片资源懒加载
  • 高频事件处理(防抖、节流)
  • 根据等待时长给予动画或是进度条
  • SPA 项目重构为 SSR 项目

npm前端包

· 阅读需 18 分钟
Fall Zhang
Coding For fun

Create by fall on 02 Mar 2023
Recently revised in 11 Feb 2025

所有的包名称就是 npm 中的包名称,可以直接在 npm 官网进行搜索

系统工具​

包名称英文介绍介绍
node-cronThis module allows you to schedule task in node.js using full crontab syntax.计划执行一些内容
cronerTrigger functions or evaluate cron expressions in JavaScript or TypeScript.定时执行任务,并提供即将到来的事件
cronstrue将 cron 表达式转换更可读

git 工具​

包名称英文介绍介绍
husky提供 git 相关的 hooks 方法
lint-stagedRun linters against staged git files在 git 缓存区强制执行 lint

命令行相关​

包名称英文介绍介绍
concurrentlyRun multiple commands concurrently.实时运行多个命令
start-server-and-testStarts server, waits for URL, then runs test command; when the tests end, shuts down server
live-server提供 npx live-server index.html
http-servernpx http-server [path] [options]
inquirerA collection of common interactive command line user interfaces.通用终端 UI 输入接口
ora优雅的终端加载动画
node-jq命令行 JSON 处理工具
enquirer命令行选择功能工具
node-gypcompiling native addon modules for Node.js.
np更好用的 npm publish
release-itAutomate versioning and package publishing自动打包和发布更新
chalk命令行内容着色
voici.js终端表格打印
fxfx data.jsonJSON 命令行处理工具
gradient-stringBeautiful color gradients in terminal output为命令行加上渐变

操作系统​

包名称介绍英文介绍
wallpaper获取或者设置桌面壁纸Get or set the desktop wallpaper
diskusage跨平台磁盘使用统计
node-osc用于在媒体设备之间进行通信的协议

工程化​

包名称英文介绍介绍
npm-check-updates-i 交互模式,查看潜在的升级并逐个选择
knipfinds unused files, dependencies and exports in your projects查看 TS 项目中没有用到的文件和依赖
dependency-cruiser将应用的依赖可视化

打包​

包名称英文介绍介绍
rspack基于 Rust 的打包工具
rolldown重写 rollup,更快更强

格式化 lint​

包名称英文介绍介绍
quick-lint-jsfinds bugs in JavaScript programs.快速分析 js 中的语法错误,C++
sugarssIndent-based CSS syntax for PostCSS.强缩进 CSS 语法检测
@biomejs/biomefast formatter for JavaScript, TypeScript, JSX, and JSONrust 重写的格式化工具,快!

测试​

包名称英文介绍介绍
jestUser-friendly glob matching.Based on fast-glob筛选文件目录
autocannonHTTP/1.1 基准测试工具
vitest基于 vite 的测试,开箱可用 import 语法
jsdom纯 JS 实现的 DOM
fetch-mock请求 mock

语法转换​

包名称官方介绍介绍
sucraseSucrase is about 20x faster than Babelbabel 的替代品,允许更快地构建
unpluginUnified plugin system for build tools.制作所有打包平台都可以使用的插件
swcsuper-fast TypeScript / JavaScript compiler written in Rust.超快的 ts / js 编译器

通用工具​

这些工具是不依赖于 DOM,前后端通用的 package

包名称英文介绍介绍
ohashSuper fast hashing library written in Vanilla JS原生书写的快速哈希库,判断对象内容是否相等
imask文字校验功能
validatorA library of string validators and sanitizers.字符串校验库
zodschema validation字符串等数据的校验工具
destr实现同 JSON.parse 的功能但更安全,支持 ts
file-type使用二进制判断文件的类型
rxjsReactive Extensions For JavaScriptJS 的响应式扩展
chardet文件,字符使用的编码方式检测库
brotli-wasm基于 Brotli 算法的压缩和解压缩工具
filesize把文件大小换算为易读的内容
math.js处理复数、分数、单位、矩阵、符号计算等
@faker-js/fakerGenerate massive amounts of fake data生成大量假数据
ip-address解析和操作 IPv4/6 地址
lossless-json避免数据过大影响 json 解析
china-division中国行政区划(五级)
emoji-regexoffers a regular expression to match all emoji symbols and sequences正则匹配所有的 emoji
culori根据颜色获取颜色名称
color-names根据颜色获取颜色名称(或者反向)
zip-stream
@zip.js/zip.js
fast-csv对 csv 文件进行快速处理
web-worker浏览器和 node 一致的 worker
alfaazthe fastest multilingual word counter号称最快的字数统计工具
workerpool将任务分配给工作池
pretty-ms将 ms 转换为好看的形式
chroma-jszero-dependency color conversions无依赖的颜色转换工具
immer不可变数据处理
mutativeefficient immutable不可变数据,效率更高
js-yaml解析 yaml 文件
tinybasereactive data store for local-first apps.本地响应式数据库
microdiffobject and array differ查看 array 和 object 的不同
madge给出指定文件的依赖关系
browser-or-node判断当前的环境,
merge-anything合并,但是是递归合并
ejs模板引擎
bwip-js条形码生成工具
superstruct数据格式验证工具(运行时
es-toolkit正实现着 Lodash 所有功能,类型支持,性能 up
@diffusionstudio/vits-web本地语音生成工具,阅读
calendar-linkCalendar link generator for popular services在各个流行平台上生成日历事件
tesseract.js基于 js 的 OCR 识别
humanifyjs代码反混淆
colorthiefGrab the color palette from an image从图像中获取主要的颜色
match-sorter确定性最佳匹配数组排序
tinybenchBenchmark your code easily
immutable不可变数据,支持 map
fraction.js数学更精确的计算

时间处理​

包名称英文介绍介绍
timeago.jsformat datetime with *** time ago返回 XX 时间之前
luxonworking with dates and times in JavaScript.时间日期处理
date-fns提供超多关于日期的处理函数
chrono-nodeA natural language date parser in Javascript.自然语言日期处理器
dayjs极小的事件处理工具
@formkit/tempoas small and easy to use as possible.小巧好用的时间工具(有TS类型支持)

node​

更倾向于服务端(node)使用的内容

包名称英文介绍介绍
undici请求库
graphqla query languageMeta 用的查询语言(一个接口请求前端想要的数据)
staticrypt轻松加密静态站点
migrate一个抽象迁移框架
ws使用 websocket
pm2·后端资源监听
piscina线程池控制工具
nodemon监听文件变动并自动执行
mqttclient library for the MQTT protocol支持 mqtt 协议
pureimage100% JavaScript implementation of theCanvas 2D drawing API for NodeJS纯 node 实现 2d canvas 绘制
tinypool轻量级/微型 Node.js 工作线程池
necord用于创建 Discord 机器人的框架
globbyUser-friendly glob matching.Based on fast-glob筛选文件目录
passport后端权限验证工具
@humanfs/nodewhat a modern, high-level filesytem API should look like.原生 fs API 应该成为的样子
node-usbNode 的改进 USB 库
phinThe lightweight Node.js HTTP client轻量请求库
node-jqc 的 json 处理工具
node-usb使用 node 操作 usb
wait-onwait for files, ports, sockets, and http(s) resources to become available等待文件等变得可用
piscinafast, efficient Node.js Worker Thread Pool implementation工作线程池库
@vinejs/vineOne of the fastest validation library for Node.js号称最快速的表单验证库

文件处理​

包名称英文介绍介绍
node-xlsx使用 node 处理 xlsx 文件
imgly/background-removal移除图像背景
sharphigh speed Node.js module is to convert large images超快速图片处理
jimp无依赖的 Node 图像处理库
node-poppler异步 PDF 渲染器
chokidar更好的 watchFile
exiftool-vendored图片拍摄信息数据访问

数据库​

包名称英文介绍介绍
lmdbLMDB 的数据存储包装器。
mongooseMongoose is a MongoDB object modeling tool对象建模工具
lowdbSimple to use local JSON database.简单的 JSON 作为 DB
json-serverGet a full fake REST API with zero coding in less than 30 seconds也是 JSON 作为 DB
node-oracledb纯 JS Oracle 数据库驱动程序
pgsql-ast-parsera Postgres SQL syntax parser.SQL 语法解析器
kanel从 Postgres 生成 TypeScript 类型
knexA batteries-included SQL query & schema builder
mysql2专注于性能的 mysql
prismaPrisma is a next-generation ORM下一代关系对象映射(自己说的)
mikro-ormTypeScript ORM for Node.js based on Data Mapper
slonikPostgreSQL client
node-pg-migratedatabase migration management built exclusively for postgres.数据库迁移工具

爬虫​

包名称英文介绍介绍
node-html-to-image将 HTML 转换为 img
crawlee网络爬虫和浏览器自动化库
gotNode HTTP 请求库
puppeteer自动化浏览器操作
linkinatornpx linkinator https://example.com/查看网站是否有效

浏览器​

更倾向于在前端使用(或者是依赖于 DOM 等浏览器提供的对象),这些包默认是不依赖框架,或者在多个框架中都可以使用的

包名称英文介绍介绍
frappe-ganttA simple, interactive, modern gantt chart library for the web甘特图,日期计划表,时间线
gantt-schedule-timeline-calendarGantt, schedule, timeline and calendar components all in one!计划表,甘特图,时间线
@schedule-x/calendar日历对工作进行管理
@fullcalendar/core日历组件
js-confetti、canvas-confetti添加一个彩带动画
satoriSatori only accepts JSX elementsdom 转化为 svg
highlight.js语法高亮
prismjs语法高亮
shikiA beautiful yet powerful syntax highlighter异步语法高亮,漂亮的代码查看器
sugar-high极小的 jsx 语法高亮
htmlparser2快速解析HTML
gridstack类似于 vue-grid-layout
melonjs成熟的 HTML5 游戏引擎。
eslint-plugin-check-file强制检查文件名称
@algolia/autocomplete-js自动完成组件
qrcode生成二维码
selectoallows select elements in the drag area using the mouse or touch.区域选择组件
@formkit/auto-animate简单的方式添加动画(支持各种框架)
@tiptap/coreBuild collaborative editor apps多人协作的编辑器
mathlive数学公式的编辑和展示
copy-text-to-clipboard将内容粘贴到剪切板(2k)
wavesurfer音频文件的波形查看器
fast-png使用原生 JavaScript 事件解码编码 PNG 图片
svguitar演示:https://github.com/omnibrain/svguitar用 SVG 做吉他谱!
axios-token-manager
axios-mock-adapterAxios adapter that allows to easily mock requestsaxios mock 适配器
@popperjs/corepopover 组件
@floating-ui/dompopover 组件
driver.js第一次进入页面的提示组件
moveable移动缩放旋转等操作
sortablejsSortable is a JavaScript library for reorderable drag-and-drop lists.列表拖拽库
capture-website获取网站截屏
reveal滚动和动画结合起来,构建展示页面
emoji-marta customizable emoji picker自定义 emoji 选择器
ai2html将 Adobe Illustrator 文件转换成 HTML
screenfull用于全屏和取消全屏展示
@tsparticles/enginehttps://particles.js.org/特效引擎
matter-jsJavaScript 2D rigid body physics engine for the web刚体物理引擎
signature_pada JavaScript library for drawing smooth signatures.写字板的签名组件
@algolia/autocomplete-js优化搜索自动提示体验
@bitjson/qr-code二维码生成
embla-carousel(非包名轮播功能(支持主流框架
jsbarcode条形码生成器
perfect-freehand让手绘内容更加优雅
atrament另一个手绘包
tanstack 非包名一系列的 UI 组件
dexieindexDB 封装
tonal音乐理论包
cally无框架无依赖原生日历
facesjs生成卡通脸部(不怎么好看
katexfast TeX math rendering快速渲染的数学符号库
simple-parallax-js视差效果
fabricsvg 和 canvas 互相转换的库
@egjs/infinitegrid多框架支持的无限滚动
html2pdf.jshtml 转为 pdf
ag-grid-community高性能数据 grid(表格)
@glidejs/glide一个滑动块(走马灯效果)
spoiled文字掩盖效果
music-metadata获取音乐原信息
click-to-component点击进入组件的源码编辑

React​

包名称英文介绍介绍
react-qrcode-logogenerate a customizable QR Code.生成带 Logo 的 qrcode
react-spinners加载动画
react-springa cross-platform spring-physics first animation library.动画库
react-chronoRender timelines in three different modes时间线组件
plyr-react自定义多媒体播放器组件
@tremor/reactThe react library to build dashboards fast快速快速构建后台
next-sitemapNext.js 应用程序的网站地图生成器
react-wrap-balancer减少内容变换的换行频率次数
react-virtuoso虚拟滚动
boring-avatarsgenerates custom, SVG-based avatars from any username and color palette.根据名称随机生成头像
react-webcam摄像头相关
react-iconsInclude popular icons in your React projectsIcon,但是 React
html-react-parserHTML 字符串解析为 React 代码的解析器
spectacle基于 React 和 JSX 的演示文库
react-virtualized强大的虚拟列表组件
react-grid-layoutRGL is React-only自定义布局的组件
react-tracking用户行为采集框架
@codesandbox/sandpack-react前端沙盒
react-quick-pinch-zoomDOM 放大和拖动,多点控制形状
react-datasheet-grid表格大数据渲染
react-scroll-sync同步滚动内容
react-to-print打印相关功能
react-scroll-parallax滚动动画
react-aria-components40 多个可自定义、支持无障碍访问的组件
shadcn/ui(不是 npm 包名shadcn/ui https://ui.shadcn.com/把 UI 组件生成到你的项目内,高可扩展
react-resize-detectormanaging element size changes in React利用 ResizeObserver 实现
react-use提供 react 的 hooks
jotaisimple useState replacement小型状态管理
zustand状态管理
react-tag-autocomplete自动完成 tag 功能
@million/lint类似 eslint,但给的是性能优化建议
react-geigerhttps://github.com/kristiandupont/react-geiger让 React 应用卡顿时发出声音
onborda产品导览功能(next
spectacle在线预览组件
astroAstro is the all-in-one web framework designed for speed.访问速度优先 md 生成 SSR 框架
reassurePerformance testing companion for React and React Native.react 和 RN 的性能测试工具
pixelmatch像素级别对比图像差异
react-acereact 的一个代码编辑器
valtio为 react 设计状态管理
@tanstack/react-query获取
@codaworks/react-glow高亮追踪功能
react-burger-menu侧边可收起展开菜单样式

UI / 组件​

包名称英文介绍介绍
react-content-loader骨架内容组件屏
react-pro-sidebarsidebar 组件库
sonnerSonner is an opinionated toast component for React.一个轻提示的组件
react-day-pickerDayPicker is a date picker component for React.日期选择(a11y)
@dnd-kit/coreBeautiful and accessible drag and drop for lists with ReactReact 可拖拽组件库
react-currency-input-field金额输入框
react-archer在 DOM 之间创建箭头
react-clockReact 时钟
react-barcode条形码
react-phone-number-input国际电话输入
react-awesome-reveal元素可见时触发动画
react-international-phone电话号码输入组件
hamburger-react菜单转换动画
react-force-graphforce-graph 的 react 版本
@codaworks/react-glow追踪高亮的功能
react-big-calendar大型日历的组件
react-signature-pad-wrapper对 signature-pad 的 react 包装
react-datepickerA simple and reusable Datepicker component for React简单的日期选择组件
vaul一个简单的抽屉组件
@uiw/react-codemirrorcodemirror react
simple-keyboard虚拟键盘
react-loading-skeletonreact 加载骨架
react-snap-carousel轮播滚动屏,自适应
react-paginate自定义页脚,用于翻页功能
reechartsd3 react 构建可视化库
@chakra-ui/system
@viselect/react可以通过框选选中多个 DOM

文件相关​

包名称英文介绍介绍
yet-another-react-lightbox支持视频和滑动的媒体图片预览组件
react-pdf在 React 应用中显示 PDF。
react-medium-image-zoom图片缩放工具
react-image-crop图片裁剪工具
@onedoc/react-print将 react 生成为 PDF

Vue​

包名称英文介绍介绍
vue-cropper一个优雅的图片裁剪插件
vuetifythe world's most popular Vue.js framework for building feature rich, blazing fast applications.Vue 组件库
vue-grid-layout可以拖拽 DOM 的大小
sandpack-vue3vue 沙盒
@formkit/core
shadcn-vueA CLI for adding components to your project.复制组件到你自己的应用程序中。
vue-qr提供 二维码生成
vue-virtual-scrollervue 虚拟滚动的
@inkline/inkline一个可定制的 Vue.js 3 UI/UX 库
radix-vueUI component library for building high-quality, accessible design systems and web appsa11y 高质量 UI 框架
@tinymce/tinymce-vueThe world's #1 open source rich text editor.富文本编辑器

编辑器​

组件名称英文介绍介绍
codemirror代码编辑器
slate富文本编辑器
prosemirror文本编辑器
@ckeditor/ckeditor5-core编辑器
lexical可扩展编辑器
monacoVS Code 的编辑器
trixRich Text Editor富文本编辑器
quill所见即所得的编辑器
micromarkCommonMark 最小的实现

markdown​

组件名称英文介绍介绍框架
remark解析 MD,输出序列化内容
markdown-itMarkdown parser done right. Fast and easy to extend.
markedMarkdown 解析器和编译器
remark-mdxremark plugin to support the MDX syntax支持 MDX 高亮
@mdx-js/mdx
@penrose/core更多数学相关图形的支持
mermaiddefinitions and a renderer to create and modify complex diagrams.为 markdown 添加更多支持
@milkdown/core编辑 markdown 所见即所得
turndown将 html 转换为 markdown
markdown-to-jsx将 markdown 转换为 jsxreact
@blocknote/core开源多人协作文档
@mdxeditor/editor更轻量的 markdown 编辑器
codehikebridges the gap between Markdown and React把 markdown 转为 react

文件查看​

组件名称文档类型介绍
docx-previewdoc/docx前端 docx 文件预览组件
mammothdoc/docx前端 word 编辑文件,可导出为 html
docxdoc/docx简单生成和修改 docx 文件
xlsxxlsx提供 xlsx 数据处理(官方切换了 git 和安装的地址,详见连接)
exceljsxlsx操作和书写数据,并且转化为 xlsx 和 JSON
handsontablexlsx数据绑定,数据分析,筛选,排序,和操作
pptxgenjspptx创建 js ppt
@webtoon/psdpsd无依赖的 .psd 文件解析器
@pdfslick/corepdf基于 PDF.js 的 pdf 文件查看器

CSS​

组件名称文档类型介绍
css-doodleA web component for drawing patterns with CSS.使用 CSS 画图案
@medv/finderCSS Selector Generator生成 DOM 最短的 selector(选择器)

可视化​

组件名称文档类型介绍框架
plotly.jsa standalone Javascript data visualization library独立的可视化库
plotteus时间叙事的可视化库(滚动、UI 控件)
reagraph基于 WebGL 的 React 图形可视化库(600 starsReact
@visx/visx基于 D3 的 React 可视化React
@xyflow/react 或 reactflowbuilding node-based UIs with React or Svelte.流程图,MITReact
@excalidraw/excalidrawvirtual hand-drawn style whiteboard.超级画布react
@glideapps/glide-data-gridhttps://grid.glideapps.com/表格 + 可视化
spacekit.js宇宙 3D 视图
vizzuhttps://lib.vizzuhq.com/latest/新的动画可视化库
cytoscapelibrary for visualisation and analysis关系图,各个内容间的联系
peaks.jsdisplay and interact with audio waveforms音频文件的波形查看器和操作
bpmn-js标准的 BPMN 图
chart.jsSimple yet flexible JavaScript charting for designers & developers简单灵活的 chart
apexchartsbuild interactive data visualizations with simple API编写互动数据

跨端​

React Native​

包名称英文介绍介绍
react-native-permissionsRN 的统一权限 API
react-native-picker-select选择功能
react-native-svg提供一个兼容层来适配 React。
react-native-shareRN 分享功能
tamaguiStyle and UI for React(web and native)
@shopify/react-native-skiaHigh-performance 2d Graphics for React Native using Skia绘制 2D 图像库
react-native-image-pickerselect a photo/video from the device library or camera.从设备上选择图片文件
@expensify/react-native-live-markdown跨平台 Markdown 编辑器
react-native-bootsplash启动页面
react-native-vision-camerapowerful, high-performance Camera library相机库
react-native-circular-progress动画进度
react-native-background-actions运行后台任务的后台服务库
react-native-filamentRN 3d 渲染引擎
react-native-compressor上传前压缩

tauri​

包名称英文介绍介绍

electron​

包名称英文介绍介绍

2分钟环境搭建

· 阅读需 5 分钟
Fall Zhang
Coding For fun

环境配置​

当然不是普通的环境搭建方式,而是敲(或者是复制粘贴)三五行代码就可以搞定的那种安装。

使用 Chocolatey 进行快速安装,以及一些 PowerShell、VS code 、npm 的配置。

Chocolatey​

使用命令行批量安装 Windows 软件,同类命令行应用有:Scoop 、winget

这节课,我们学习使用 Chocolatey。

WinGet 作为微软官方出品还需观望,也不知道微软这次靠不靠谱。

choco 安装​

在 powershell(右键开始菜单,选中 Windows PowerShell 管理员)执行下面程序进行安装

Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

注:必需要管理员权限才能进行安装。否则报一大堆错

软件使用​

你可以访问 https://community.chocolatey.org/packages 进行线上搜索可以安装的软件

例如,安装 node.js、nvm

choco install nodejs
choco install nvm

一行代码搞定前端全家桶!

# windows 系统
# 不建议直接安装 node,而是通过 nvm 安装 node
choco install -y googlechrome firefox git vscode nvm

# 使用 nvm 安装 20.19.0 版本的 node
nvm install 20.19.0
# 使用 20.19.0 版本的 node
nvm use 20.19.0

注:可以查看 nvm 工具的使用 注:安装的 firefox 是国际版的,不是国内版,两个版本之间无法共享账户数据

不仅仅是前端全家桶

安装 python 全家桶!

choco install -y git tortoisegit vscode python
refreshenv
python -m pip install --upgrade pip
# 中国教育网用户切换镜像
# pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install pipenv

安装 docker

choco install docker-desktop

安装 powertoys(微软推出的便利工具集合)

choco install powertoys

搜索软件​

choco search nodejs

VS code​

快捷键​

  • ctrl + D:阔选光标所在位置的内容,再次按下阔选相同内容
  • Alt + Shift + F:格式化代码
  • alt + ↑/↓:移动选中的整行内容
  • shift + alt +↑/↓:复制当前选中的行
  • ctrl + enter:创建新的行,并且跳转到下一行
  • ctrl + ~:呼出 vs code 命令行
  • ctrl + /:为所选区域添加注释
  • alt + shift +a:为所选区域添加注释,注意,这个快捷可能微信的截图 alt + a 冲突
  • 选中变量,然后点击 f2,可以重命名所有名称相同的变量,该操作跨文件

插件​

  • Chinese(simplified)功能和名字一样,提供中文的操作界面
  • Git Graph,提供图表方式来查看 git 版本历史
  • volar 为 vue 提供代码高亮,代码格式化
  • Material Icon Theme 提供各式各样的图标,用来美化和区分不同类型的文件
  • node-snippets 快速生成 node 代码块
  • ESlint 控制代码规范,对代码进行格式化处理,在配置中可以开启格式化功能

慎用插件

应用名称插件功能
小霸王小霸王游戏机
超级鼓励师加油,你是最棒的,年薪百万就在前方。
韭菜盒子/vscode-stocks看股票走势
电影集看电影,刷剧
daily-anime喜欢二次元,喜欢动漫,番剧的更新。
read-vscode-e/Thief-Book/网易云阅读,可以一边敲代码一边看小说。
vsc-netease-music可以听音乐,好像音乐本身感知不强,意义也不大。
vscode-maxPlus浏览游戏资讯。
vscode-leetcode刷算法。
Zhihu On VScode刷知乎。
fakeupdate模仿各种电脑系统的系统更新。
LeetCode刷算法
NBA real-time score看NBA数据。

默认配置​

可以同步到 github 上面

// 注意要在设置中开启保存时格式化代码
{
"workbench.iconTheme": "material-icon-theme",
"editor.fontSize": 14,
"editor.wordWrap": "on",
"editor.linkedEditing":true,
"editor.tabSize": 2,
"editor.detectIndentation": false,
// 滚轮缩放编辑器大小
"editor.mouseWheelZoom": false,
"diffEditor.ignoreTrimWhitespace": false,
"editor.unicodeHighlight.nonBasicASCII": false,
"diffEditor.renderSideBySide": false,
"javascript.updateImportsOnFileMove.enabled": "never",
// 可以生成预览窗口,而不是打开一个文件就是一个独立的窗口
"workbench.editor.enablePreview": true,
"editor.formatOnSave": true,
"[javascript]": {
"editor.defaultFormatter": "dbaeumer.vscode-eslint"
},
"[html]": {
"editor.defaultFormatter": "vscode.html-language-features",
},
"[json]": {
"editor.defaultFormatter": "vscode.json-language-features"
},
"[typescript]": {
"editor.defaultFormatter": "rvest.vs-code-prettier-eslint"
},
"[jsonc]": {
"editor.defaultFormatter": "rvest.vs-code-prettier-eslint"
},
"[vue]": {
"editor.defaultFormatter": "Vue.volar"
},
"editor.quickSuggestions": {
"strings": true
},
"search.followSymlinks": false,
"search.maxResults": 200,
"files.autoSave": "onFocusChange",
"emmet.includeLanguages": {
"editor.formatOnType": "true",
"editor.formatOnSave": "true"
},
"git.confirmSync": false,
"editor.fontLigatures": false,
"editor.autoClosingOvertype": "always",
"editor.stickyScroll.enabled": true,
"editor.stickyScroll.maxLineCount": 3,
"css.lint.float": "warning",
"css.lint.duplicateProperties": "error",
"css.lint.important": "warning",
"css.lint.universalSelector": "warning",
"less.lint.universalSelector": "warning",
"scss.lint.duplicateProperties": "warning",
"scss.lint.float": "warning",
"eslint.format.enable": true,
"[scss]": {
"editor.defaultFormatter": "vscode.css-language-features"
},
"window.commandCenter": false,
"extensions.autoUpdate": "onlyEnabledExtensions",
"explorer.compactFolders": false,
}

其它配置​

windows 系统​

可以在 设置:系统 -> 存储 -> 保存新内容的地方 进行配置

全部切换到需要的磁盘

PowerShell​

如果 powershell 不能执行一些命令,需要进行修改执行策略:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

wsl​

windows subsystem for linux

linux 的子系统

# 安装 wsl
wsl --install
# 安装 ubuntu
wsl --install -d Ubuntu-22.04
# 安装后,可以通过下面命令查看当前电脑上的 wsl 子系统
wsl -l -v
# 以下命令查看线上拥有的 linux 版本
wsl -l -o

npm​

npm -v 用于检测 npm 是否安装成功(安装 node 时会同时安装 npm)

注:因为某些大家知道的原因,可能需要更换为国内的镜像,或者安装 yarn、pnpm,代替 npm。

通过该命令 npm get registry 查看当前使用的镜像。

通过 npm set registry [target-webset] 设置镜像

一些镜像网址

  • https://registry.npmjs.org/(默认镜像网址)
  • https://registry.npmmirror.com/(阿里镜像,原地址为 https://registry.npm.taobao.org)

项目创建​

初始项目搭建

pnpm create vite my-app-name --template <template-name>

支持的模板:

  • 原生:vanilla、vanilla-ts
  • Vue:vue、vue-ts
  • React:react、react-ts、react-swc、react-swc-ts、preact、preact-ts
  • Lit:lit、lit-ts
  • Svelte:svelte、svelte-ts

TypeScript声明

· 阅读需 5 分钟
Fall Zhang
Coding For fun

声明空间​

声明空间,就是声明类型和声明变量所在的不同空间。类型声明空间是 TypeScript 声明的类型空间,这些空间的变量不能进行赋值。变量声明空间可以进行赋值:

类型声明空间

class Foo{}
type Bus = {}
interface Bar{}
// 这些都可以作为类型注解使用
let foo:Foo
let bus:Bus
let bar:Bar
// 但是 Bar、Bus 不能赋值,因为它们只存在类型声明空间
const bar = Bar // error: cannot find name 'Bar'

变量声明空间

class Foo {}
const someVar = Foo
// class Foo {} Foo 既会被放置到变量声明空间,也会放到类型声明空间
// 所以 class 声明的内容既可以作为类型注解,也可以进行赋值

全局模块​

全局模块就是任何文件都可以访问的模块,默认情况下,在一个新的 ts 文件中写代码时,它处于全局命名空间中。

// foo.ts
const foo = 123
// 此时,如果在相同的项目里,创建一个新的文件 bar.ts 系统会允许你使用 foo 内的内容
// bar.ts
const back = foo

想避免暴露在全局作用空间

// foo.ts
export const foo = 123
// 如果想继续使用 foo 就需要进行导入,并且使用其他变量也不会污染全局作用域
// bar.ts
import {foo} from './foo' // 此时还会将该文件定义为一个模块,文件内定义的变量也不会污染全局空间
const back = foo

所以文件内,只要使用了 export 关键字,就会表示该文件是个模块。所以也常使用 export {} 放在首行,表示是一个模块。

环境声明​

通过 declare 关键字来告诉 TypeScript 一个其他地方已经存在的代码(内容)。

// main.ts
foo = 1123 // Error

通常会使用 .d.ts 结尾的文件进行声明,一般会使用 global.d.ts 或者 vendor.d.ts。

// global.d.ts
declare let foo:any
// main.ts
foo = 1123 // declare 声明了该变量,将不会报错

其他的声明文件也类似于该文件,但是更加详细,所以如果自带 .d.ts 结尾的声明文件,一般不需要自行书写。

在声明文件中,每个根级别的声明必须以 declare 关键字作为前缀, TypeScript 将不会把它编译成任何代码。

开发者需要确保这些声明文件,和声明的内容在编译时存在。

声明文件可以声明各种类型

TS的声明文件​

编译器通过声明文件能够显示来自其他包的错误和提示。并且声明文件提供有关库的所有类型信息。

获取一个库的声明文件有两种方式

  • Bundled 包含了自己的声明文件,我们只需安装这个库,就可以立即使用它,看库中是否包含 index.d.ts 文件,有些库会在 package.json 文件的 typings 或 types 属性中指定类型文件。
  • Definitely Typed 是一个庞大的声明仓库,为没有声明文件的 JavaScript提供类型定义。这些类型定义通过众包的方式完成,微软和开源者一同管理。(比如 React 没有自己的声明文件,可以从 Definitely Typed 获取它的声明文件)
# yarn 
yarn add --dev @types/react
# npm
npm i --save-dev @types/react

第三方代码的声明​

有时,可能在某些内容上添加显式注解,并且你会在类型声明空间中使用它。

可以通过 type 快速实现它

declare type Staff = {
name:string
}

我个人倾向认为这是自定义声明,在声明文件中进行声明之后,在任何其他的文件中都可以使用,并且无需进行引入。在使用中要符合 declear 中定义的约束。

第三方 NPM 模块​

可以用声明一个全局模块的方式,来解决查找模块路径的问题。

global.d.ts 是一种扩充 lib.d.ts 很好的方式,如果你需要的话。

// 定义 global.d.ts
declare module 'jquery'{
// some variable declarations
export var bar: number;
}
// 导入使用 main.js
// 在必要的时候进行导入
import * as $ from 'jquery'
// import vue from 'vue' // 如果没有进行 declare 声明,直接引入会报错

有人会声明 npm i @types/jquery

非 JS 资源​

在 ts 文件中,可能引入其他类型的文件,比如 png。为了避免报错,向文件中进行声明。

// index.d.ts
declare module '*.svg'
declare module '*.png'
declare module '*.vue'{ // 用于定义以 .vue 结尾的文件,并且让 typescript 跳过识别
import type {DefineComponent} from 'vue'
const component: DefineComponent <{}, {}, any>
export default component
}
// 在声明之后就可以使用
import * as foo from './some/file.css'

参考文章​

文章名称链接
深入理解TypeScriptjkchao.github.io/typescript-…
铁皮饭盒juejin.cn/post/684490…

如有错误(不当)可以在评论区指出。

转载请注明出处。

客户想要的不是她们所说的(译)

· 阅读需 3 分钟
Fall Zhang
Coding For fun

我见过的用户中,他们没有一个不是特别详细的,迫切的想告诉我他们想要的。问题是,你的客户并不能一直告诉你实事的全貌。他们一般来讲不会说谎,但是他们的说话方式是作为用户的表达方式,而不是开发者的表达方式。她们拥有他们的团队,和他们的沟通方式。她们会遗漏重要的细节,她们会当你已经在他们公司干活 20 年了,就跟他们一样熟悉。真正复杂的是,一开始他们就不知道怎么做。一些客户可能构建了宏图,但是他们很少能充分的地交流她们认为的这些“宏图”的细节。另一些客户可能不会特别的清楚,但是他们知道她们不想要什么。在她们不完整的说出他们想要的东西的情况下,我们怎样才能去开发一个项目?答案显而易见,多去配合他们。

git功能查找

· 阅读需 9 分钟
Fall Zhang
Coding For fun

下载: 从淘宝镜像上下载 git,选择最新版就可以了

npm.taobao.org/mirrors/git…

Git工作流程图(空间上的 git 操作)

img

共有四个区域:

  • Workspace:工作区
  • Index / Stage:暂存区
  • Repository:仓库区(或本地仓库)
  • Remote:远程仓库
命令名称作用
clone(克隆)从远程克隆仓库,将远程的代码下载到本地
commit(提交)commit 将修改提交到本地仓库,
push(推送)push 将本地仓库的内容提交到远程库
pull(拉取)将远程最新的代码拉取到本地,自动合并 merge
fetch(获取)将远程最新的代码拉取到本地,不合并 merge
checkout(检出)创建分支,切换分支
reset将代码回退到选定的版本
tag就是给版本打个标记,方便识别

git 工具​

git介绍​

配置文件​

.gitignore 是 git 的配置文件,可以用在用户主目录之下(全局配置),也可以用在项目目录下(项目配置),作用就是告诉Git 哪些文件不需要添加到版本管理中。

/mtk/ 过滤整个文件夹
*.zip 过滤所有.zip文件
/mtk/do.c 过滤某个具体文件
复制代码

通过上面这些规则进行过滤之后,被过滤的文件不会通过push传递到服务器,本地库中还是存在的。

!src/   不过滤该文件夹
!*.zip 不过滤所有.zip文件
!/mtk/do.c 不过滤该文件
复制代码

可以通过以上设置不过滤以上的文件

配置文件的语法

以斜杠/开头表示目录;
以星号*通配多个字符;
以问号?通配单个字符
以方括号[]包含单个字符的匹配列表;
以叹号!表示不忽略(跟踪)匹配到的文件或目录;
复制代码

配置文件示例

a、规则:fd1/*
忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,还是某个子目录 /child/fd1/ 目录都会被忽略;
b、规则:/fd1/*
说明:忽略根目录下的 /fd1/ 目录的全部内容;
c、规则:
/*
!.gitignore
!/fw/bin/
!/fw/sf/
说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的 /fw/bin/ 和 /fw/sf/ 目录
复制代码

用 Git Bash 创建文件夹

  • 根目录下右键选择“Git Bash Here”进入bash命令窗口;
  • 输入vim .gitignore或touch .gitignore命令,打开文件(没有文件会自动创建);
  • 按i键切换到编辑状态,输入规则,例如node_modules/,然后按Esc键退出编辑,输入:wq保存退出。

生成密钥​

命令行中执行命令:

ssh-keygen -t rsa -C "xxxx@gmail.com" 必须填写自己使用的邮箱

git 的操作​

简单的提交代码流程​

连接克隆远程仓库 git clone balabalabala.com

在项目的文件夹中打开cmd 命令行工具(一般为含有 ReadMe 的文件夹)

git add . 将代码添加到版本里面(添加到暂存区)

git commit -m “放置你想添加的内容”

最后使用 git push 将本地库里面的代码提交到网络共享库里面

常用功能查找​

  • git diff --shortstat "@{0 day ago}" 看看自己一天写了多少代码
  • 查看远程仓库git remote -v
  • 显示有变更的文件git status
  • 退回到上一个版本:git reset --hard head
  • 查看日志:git log 或者 git reflog
  • 查看工作区和暂存区版本区别git diff
  • 回退上一个版本git reset --hard HEAD^ 每多一个^多回退一个版本
  • 回退到指定版本git reset --hard version version 为版本号

新建代码仓库​

  • git init 在本地进行初始化(建立工作区)
  • git init [project-name] 新建一个目录,作为代码仓库
  • git clone [url]

.git 文件夹存储当前项目的所有版本信息,这个文件夹通常会隐藏

暂存区控制​

$ git add [file1] [file2] ...  # 添加指定文件到暂存区
$ git add [dir] # 添加指定目录到暂存区,包括子目录
$ git add . # 添加当前目录的所有文件到暂存区

$ git add -p
# 确认所有文件的变化,并且可以做最终修改
# 对于同一个文件的多处变化,可以分多次提交

$ git rm [file1] [file2] ... # 删除工作区文件,并且将这次删除放入暂存区
$ git rm --cached [file] # 停止追踪指定文件,但该文件会保留在工作区
$ git mv [file-original] [file-renamed] # 改名文件,并且将这个改名放入暂存区
复制代码

本地仓库​

$ git commit -m "message" # 提交暂存区内容提交到仓库区
$ git commit [file1] [file2] ... -m [message] # 提交暂存区的指定文件到仓库区
$ git commit -a # 提交工作区自上次 commit 之后的变化,直接到仓库区
$ git commit -v # 提交时显示所有 diff 信息

$ git commit --amend -m [message]
# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次 commit 的提交信息 message

$ git commit --amend [file1] [file2] ... # 重做上一次commit,并包括指定文件的新变化
复制代码

分支操作​

$ git branch # 列出所有本地分支
$ git branch -r # 列出所有远程分支
$ git branch -a # 列出所有本地分支和远程分支

$ git checkout master # 切换到master分支下
$ git checkout -b [branch] # 新建一个分支,并切换到该分支
$ git branch [branch-name] # 新建一个分支,但依然停留在当前分支

$ git branch [branch] [commit] # 新建一个分支,指向指定commit
$ git branch --track [branch] [remote-branch] # 新建一个分支,与指定的远程分支建立追踪关系
$ git checkout [branch-name] # 切换到指定分支,并更新工作区
$ git checkout - # 切换到上一个分支

$ git branch --set-upstream [branch] [remote-branch] # 建立追踪关系,在现有分支与指定的远程分支之间
$ git merge [branch] # 合并指定分支到当前分支
$ git cherry-pick [commit] # 选择一个commit,合并进当前分支
$ git branch -d [branch-name] # 删除分支

# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
复制代码

远程功能​

$ git fetch [remote] # 下载远程仓库的所有变动
$ git pull [remote] [branch] # 取回远程仓库的变化,并与本地分支合并
$ git remote -v # 显示所有远程仓库
$ git remote show [remote] # 显示某个远程仓库的信息
$ git remote add [shortname] [url] # 增加一个新的远程仓库,并命名

$ git push origin master # 推到 master 上
$ git push [remote] [branch] # 上传本地指定分支到远程仓库
$ git push [remote] --force # 强行推送当前分支到远程仓库,即使有冲突
$ git push -u origin login # 将当前子分支推到一个新创建的 login 分之中

$ git push [remote] --all # 推送所有分支到远程仓库
$ git push origin --delete [branch-name] # 删除远程分支
复制代码

撤销操作​

$ git checkout [file] # 恢复暂存区的指定文件到工作区
$ git checkout [commit] [file] # 恢复某个commit的指定文件到暂存区和工作区
$ git checkout . # 恢复暂存区的所有文件到工作区
$ git reset [file] # 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变

$ git reset --hard # 重置暂存区与工作区,与上一次commit保持一致
$ git reset [commit] # 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
$ git reset --hard [commit] # 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
$ git reset --keep [commit] # 重置当前HEAD为指定commit,但保持暂存区和工作区不变

$ git revert [commit]
# 新建一个commit,用来撤销指定commit
# 后者的所有变化都将被前者抵消,并且应用到当前分支

# 暂时将未提交的变化移除,稍后再移入
$ git stash
$ git stash pop
复制代码

标签的设定和查看​

$ git tag # 列出所有tag
$ git tag [tag] # 新建一个tag在当前commit
$ git tag [tag] [commit] # 新建一个tag在指定commit
$ git tag -d [tag] # 删除本地tag

$ git push origin :refs/tags/[tagName] # 删除远程tag
$ git show [tag] # 查看tag信息
$ git push [remote] [tag] # 提交指定tag
$ git push [remote] --tags # 提交所有tag
$ git checkout -b [branch] [tag] # 新建一个分支,指向某个tag
复制代码

查看日志信息​

$ git status # 显示有变更的文件
$ git log # 显示当前分支的版本历史
$ git log --stat # 显示commit历史,以及每次commit发生变更的文件
$ git log -S [keyword] # 搜索提交历史,根据关键词

$ git log [tag] HEAD --pretty=format:%s # 显示某个commit之后的所有变动,每个commit占据一行
$ git log [tag] HEAD --grep feature # 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
$ git log --follow [file] # 显示某个文件的版本历史,包括文件改名
$ git whatchanged [file]

$ git log -p [file] # 显示指定文件相关的每一次diff
$ git log -5 --pretty --oneline # 显示过去5次提交
$ git shortlog -sn # 显示所有提交过的用户,按提交次数排序
$ git blame [file] # 显示指定文件是什么人在什么时间修改过

$ git diff # 显示暂存区和工作区的差异
$ git diff --cached [file] # 显示暂存区和上一个commit的差异
$ git diff HEAD # 显示工作区与当前分支最新commit之间的差异
$ git diff [first-branch]...[second-branch] # 显示两次提交之间的差异

$ git diff --shortstat "@{0 day ago}" # 显示今天你写了多少行代码
$ git show [commit] # 显示某次提交的元数据和内容变化
$ git show --name-only [commit] # 显示某次提交发生变化的文件
$ git show [commit]:[filename] # 显示某次提交时,某个文件的内容

$ git reflog # 显示当前分支的最近几次提交