前端迅速上手
目录
简介
这里记录前端的迅速上手.
可能十年前这里记录的是 jQuery 相关的技术, 而现在记录比较更现代的技术.
基础使用
前置条件 - 安装 nodejs
fnm 跨平台/速度快
这里可以看到fnm比nvm快45倍, 而且跨平台. 所以我准备切换到 fnm
- 下载二进制 Releases · Schniz/fnm
- 放到 path 路径下
- 配置 bash/zsh/fish 的环境变量
# 使用特定的源
export FNM_NODE_DIST_MIRROR=https://mirrors.ivolces.com/nodejs-release/
# 或者 --node-dist-mirror https://mirrors.aliyun.com/nodejs-release/
# 安装lts版本
fnm install --lts
# 指定默认的版本
fnm default lts-latest
# 查看
fnm ls
# 使用特定版本
fnm use default
fnm use v20.11.1
# 当前使用
fnm currentnvm/用的人多/久经考验
下载 nvm-windows 管理不同 nodejs 的版本
# 展示可用的版本
nvm list available
# 安装指定大版本
nvm install 18
# 指定小版本
nvm install 18.16.0
# 使用版本
nvm use 18.16.0
# 已安装的版本
nvm list
# 不推荐使用winget,经常版本切换的情况下
# 安装nodejs稳定版
winget install OpenJS.NodeJS.LTS配置 nodejs
# 配置镜像源
npm config set registry https://registry.npmmirror.com
# 加速二进制文件下载
npm i --registry=https://registry.npmmirror.com --disturl=https://npmmirror.com/dist
# 这个节省磁盘,速度快。更新也是一样的命令,降级用pnpm@1.1.1这样
npm i -g pnpm
# 安装ts
npm i -g typescript
# web框架
npm i -g @nestjs/cli
# 查看全局安装的包
npm list -g
# pnpm开始代替npm
pnpm add xxx
pnpm update
pnpm list
pnpm remove
npx => pnpm dlx创建项目
VUE 官网版本
# 创建项目,默认叫vue-project
pnpm create vue@latest [vue-project]
# 启用ts,vue-router,pinia,eslint,prettier,extension for debug
# 禁用jsx,vitest,end to end test
# 进入文件夹
cd vue-project
# 安装依赖
pnpm i
# 启动
pnpm run dev
# 构建html,输出内容在dist内
pnpm run build
# 查看是否有过期的包
pnpm outdated
# 更新包,加上--dev可以更新开发依赖 (只更新小版本)
pnpm update
# 全更新到latest
pnpm up --latesttailwindcss/primevue 版本
primevue 有 styled 和 unstyled 模式 2 种, 都可以和 tailwindcss 配合使用.
- 推荐 styled 适合只需要进行微调的, 它有默认样式, 也可以通过 tailwindcss 覆盖来自定义
- unstyled 适合完全自己画 UI. 它可以完全没有任何样式, 使用 presets 快速应用主题, 也还是会需要自己调整 body 背景颜色.
styled 实践
- 切换主题
document.documentElement.classList.toggle('p-dark') - PrimeVue自动导入
- 配置 tailwindcss
# 先创建vue项目
# 安装依赖
pnpm add primevue @primeuix/themes
# 自动导入
pnpm add @primevue/auto-import-resolver unplugin-vue-components -D
# vim vite.config.js
import Components from 'unplugin-vue-components/vite'
import { PrimeVueResolver } from '@primevue/auto-import-resolver'
export default defineConfig({
plugins: [
Components({
resolvers: [PrimeVueResolver()]
})
]
})
# main.ts引入使用
import app from './app'
app.mount('#app')
# app.ts
# 修改主题颜色
import Aura from '@primeuix/themes/aura'
import { definePreset } from '@primeuix/themes'
const MyPreset = definePreset(Aura, {
semantic: {
primary: {
50: '{indigo.50}',
100: '{indigo.100}',
200: '{indigo.200}',
300: '{indigo.300}',
400: '{indigo.400}',
500: '{indigo.500}',
600: '{indigo.600}',
700: '{indigo.700}',
800: '{indigo.800}',
900: '{indigo.900}',
950: '{indigo.950}'
}
}
})
# 引入使用
import PrimeVue from 'primevue/config'
app.use(PrimeVue, {
theme: {
preset: MyPreset,
options: {
prefix: 'p',
darkModeSelector: '.p-dark',
// cssLayer: {
// name: 'primevue',
// order: 'tailwind-base, primevue, tailwind-utilities'
// }
}
}
})
# tailwindcss官网
https://tailwindcss.com/docs/installation/using-vite
# 示例
<h1 class="text-3xl font-bold underline"> Hello world! </h1>
<InputText placeholder="Overriden" class="p-8" />
<Button label="切换主题" @click="theme"></Button>
import Button from 'primevue/button';
import InputText from 'primevue/inputtext';
const theme = () => {
document.documentElement.classList.toggle('p-dark')
}unstyled 实践 #todo/笔记
# unstyled
pnpm add primevue
import PrimeVue from 'primevue/config'
import Aura from '@/presets/lara'
app.use(PrimeVue, {
unstyled: true,
pt: Aura
})
pnpm add tailwindcss-primeui
vim tailwind.config.js
import tpp from 'tailwindcss-primeui'
module.exports = {
...
content: [
"./presets/**/*.{js,vue,ts}",
],
plugins: [tpp]
}颜色变量
- PrimeVue颜色面板 - Color Palette
- 取色参考
- 主色
--p-primary-color
- 背景色
- 全局背景
- 浅色模式
bg-surface-100作为背景色- 内容色
--p-content-backgroud,bg-surface-0,--p-surface-0- 和 primevue 一样使用
bg-surface-0来和背景bg-surface-100做分层, 内部可嵌套bg-surface-100 - 0 作为导航和卡片背景色, 100 内容区的左右空白部分的填充色
- 和 primevue 一样使用
- 深色模式
bg-black作为背景色- 内容色
--p-content-backgroud,bg-surface-900,--p-surface-900 - 内容的内容色
bg-surface-800, 如果还要分层, 考虑层级是不是太多了
- 浅色模式
- 元素背景
bg-primary主色做背景, 例如按钮颜色, 搭配hover:bg-primary-emphasis实现鼠标移动上去颜色变化bg-highlight和hover:bg-highlight-emphasis同理
- 弹出层背景颜色
--p-mask-color--p-mask-background
- 取值
--p-content-background
- 全局背景
- 边框
border rounded-border- 灰色边框
border-surface - 透明边框
border-transparent - 通常取值
--p-surface-200,例如--p-content-border-color
- 灰色边框
- 文本颜色
- 文本颜色
text-color, 取值于--p-text-color - 辅助文本
text-muted-color, 取值于--p-text-muted-color
- 文本颜色
- hover 颜色
--p-content-hover-background--p-content-hover-color--p-primary-hover-color--p-content-hover-color--p-text-hover-color--p-text-hover-muted-color
下面是 primevue 以前用的变量, 现在不存在了, 但是可以用作取色参考
--surface-ground: var(--p-surface-100);
--maskbg: var(--p-mask-background);
--primary-color: var(--p-primary-color);
--primary-contrast-color: var(--p-primary-contrast-color);
--text-color: var(--p-text-color);
--text-color-secondary: var(--p-text-muted-color);
--surface-border: var(--p-content-border-color);
--surface-card: var(--p-content-background);
--surface-hover: var(--p-content-hover-background);
--surface-overlay: var(--p-overlay-popover-background);
--transition-duration: var(--p-transition-duration);
--content-border-radius: var(--p-content-border-radius);
--layout-section-transition-duration: .2s;
--element-transition-duration: var(--p-transition-duration);
--focus-ring-width: var(--p-focus-ring-width);
--focus-ring-style: var(--p-focus-ring-style);
--focus-ring-color: var(--p-focus-ring-color);
--focus-ring-offset: var(--p-focus-ring-offset);
--focus-ring-shadow: var(--p-focus-ring-shadow);
--code-background: var(--p-surface-900);
--code-color: var(--p-surface-200);颜色变量写法
<SvgIcon style="background-color:var(--p-primary-color); color:var(--p-content-background);" name="logo" />
<SvgIcon class="bg-[var(--p-primary-color)] text-[var(--p-content-background]" name="logo" />Nuxt 版本
nuxt 是 vue 的全家桶。同时通过约定大于配置,帮助迅速开发。
Installation · Get Started with Nuxt
# 创建项目
pnpm dlx nuxi@latest init nuxt-project
# 运行
pnpm dev
# 静态页面
pnpm generate
# 文件内容在 .output\public
# 构建ssr
# build以后启动 node .output/server/index.mjs
pnpm build
# pm2守护进程运行起来
# https://nuxt.com/docs/getting-started/deployment#pm2Nestjs 版本
Nestjs 是 nodejs 服务端的 web 框架
# 新建项目
nest new nest-project开发工具配置 - vscode
安装插件
调试
传统 web 项目的 launch.json
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "启动程序",
"runtimeExecutable": "pnpm",
"runtimeArgs": [
"run",
"start:dev"
],
"console": "integratedTerminal"
}
]
}typescript 的 launch.json
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "启动程序",
"preLaunchTask": "tsc-build",
"program": "dist/main.js"
}
// 终端运行 tsc --watch , 就不需要preLaunchTask了
// {
// "type": "node",
// "request": "launch",
// "name": "启动程序",
// "program": "dist/main.js"
// }
]
}配合这里使用 tasks.json
{
"version": "2.0.0",
"tasks": [
{
"type": "typescript",
"tsconfig": "tsconfig.json",
"problemMatcher": ["$tsc"],
"group": {
"kind": "build",
"isDefault": true
},
"label": "tsc-build"
}
]
}gitignore
# compiled output
dist
node_modules
# Logs
logs
*.log
npm-debug.log*
pnpm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
# OS
.DS_Store
# Tests
/coverage
/.nyc_output
# IDEs and editors
/.idea
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace
# IDE - VSCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json语法
模块
// 在*.d.ts文件中
// 引入函数,对象
import { WebDAVClient, WebDAVClientOptions } from "./types.js";
// 声明函数的接口,但是实现在别的模块或文件中
export declare function createClient(remoteURL: string, options?: WebDAVClientOptions): WebDAVClient;
// 导出函数,说明createClient方法在factory.js中
export { createClient } from "./factory.js";生态/选型
- 框架。
- 需求
- 必须支持 tailwindcss,我 css 很菜记不住,且 ai 友好
- 组件越多越好,减少工作量
- 充分自定义
- 持久更新,减少学习成本
- 满足需求
- Nuxt UI 推荐
- dogfooding。那 menu 组件举例。不像 primevue 在很多页面自己写样式/功能,不把功能封装到组件里
- 被 vercel 收购后,全部都免费了。有商业支持更好了
- PrimeVue - Vue UI Component Library
- 基础组件很多,但是有一些不好用。比如 panelmenu 不如 nuxtui/navmenu 常用
- 有 blocks 付费组件,一些好用的可能需要收费
- 有商业支持
- Shadcn for Vue - shadcn/vue
- 不太喜欢把组件下载到本地,觉得版本升级不友好
- 在 css 文件里就一个个组件加,而不是 tree sharking。不友好
- Nuxt UI 推荐
- 其他
- 官方挑的UI库
- 不要 tailwindcss 的话,那就直接 element-plus
- tdesign,arco,antdv 的 3 大厂支持 tailwindcss 的时候可以选择
- arco design vue 似乎停更了
- 需求
- 后台自己写
- 现在市面上的后台都大而全,接口/权限改动比较复杂
- 后台常用的界面,权限都是一次性的。学习使用不如自己来写
- 参考列表
- vben 太重了, 模板不更新. 也是 tsx
- pure-admin 前 element 团队员工, admin 模板会永远同步最新瘦身版
- tdesign vite 更新不及时. 表格 tsx
- arco tsx 淘汰
前台
因为现在用 Vue, 所以可以看看 官方挑的UI库. 其中我选择支持 tailwindcss手册 的, 因为方便自己调整样式,且生态很好.
- Nuxt UI 只有 Nuxt 能用
- Headless UI 组件太少了
- flowbite 社区不够大. toast 之类工具的js 用法不友好
- daisyUI 缺少 js 响应. 例如全局 toast 弹窗.
- shadcn/ui 类似 ant-design, 要使用 Vue 的社区版本 . 对比 prime 缺少依赖移动导入. 版本控制不好做
- 因为有相关的 js, 例如 toast, 而 daisy 没有
- 从 2008 年开始, 历史悠久, 有商业支持
- 相关适用参考 我的tailwindcss笔记
问题处理
npm timing 卡住
# nuxt初始化的时候,如果npm -v版本高于6,就会卡柱
npx nuxi@latest init nuxt-project
# 降级
npm install -g npm@6不得不说前端的问题是真的多… 参考 这个问题 就会发现, 很多人都踩过坑. 但还是会浪费你的时间
fast-folder-size 安装报错
du64.exe not found at D:\code\js\learn\nuxt-project\node_modules\fast-folder-size\bin\du64.exe
downloading du.zip from https://download.sysinternals.com/files/DU.zip
if you have trouble while downloading, try set process.env.FAST_FOLDER_SIZE_DU_ZIP_LOCATION to a proper mirror or local file path手动处理
# 下载文件,配置环境变量.重新运行命令
$env:FAST_FOLDER_SIZE_DU_ZIP_LOCATION = "C:\Users\80542\Downloads\DU.zip"