前端迅速上手
目录
简介
这里记录前端的迅速上手.
可能十年前这里记录的是 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 current
nvm/用的人多/久经考验
下载 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
tailwindcss/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 @primevue/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 { createApp } from 'vue';
const app = createApp(App);
# 修改主题颜色
import Aura from '@primevue/themes/aura'
import { definePreset } from '@primevue/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
# 安装依赖
pnpm add -D tailwindcss postcss autoprefixer
# 创建文件 tailwind.config.js 和 postcss.config.js
npx tailwindcss init -p
# 配置tailwind.config.js的content
export default {
content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
}
# main.css内容
# 不同于tailwindcss,内容来自 https://primevue.org/tailwind/#override
/* @tailwind base;
@tailwind components;
@tailwind utilities; */
@layer tailwind-base, primevue, tailwind-utilities;
@layer tailwind-base {
@tailwind base;
}
@layer tailwind-utilities {
@tailwind components;
@tailwind utilities;
}
# 在main.ts里引用
import './assets/main.css'
# tailwind.config.js
pnpm add tailwindcss-primeui
import tpp from 'tailwindcss-primeui'
export default {
plugins: [tpp]
}
# 示例
<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]
}
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#pm2
Nestjs 版本
Nestjs
是 nodejs 服务端的 web 框架
# 新建项目
nest new nest-project
开发工具配置 - vscode
安装插件
- Iconify IntelliSense - Iconify 图标插件
- windicss IntelliSense - windicss 提示插件
- I18n-ally - i18n 插件
- Volar - vue 开发必备
- ESLint - 脚本代码检查
- Prettier - 代码格式化
- Stylelint - css 格式化
- DotENV - .env 文件 高亮
- TypeScript Vue Plugin (Volar) - 用于让 TS 识别 *.vue 文件。
调试
传统 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"
}
]
}
语法
模块
// 在*.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";
生态
后台
看了一下市面上的 ui 组件和生态
- vben 太重了,模板不更新. 也是 tsx
- pure-admin 前 element 团队员工, admin 模板会永远同步最新瘦身版
- tdesign vite 更新不及时. 表格 tsx
- arco tsx 淘汰
最终还是选择了 element-plus ,并且 自己写后台.
- 因为用的人多, 踩过的坑基本都才过了.
- 现成的 admin 基本上都要改动不少后端内容.
前台
因为现在用 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笔记
同时还看了一下 react 的 ui 库.
- nextui 更新慢 缺少Toasts
问题处理
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"