Vite + React + tailwindcss + ts + 多Nodejs环境... 速搭

最近接触了前端代码,作为一个后端,能将其搭起来并用于生产,我感到很是欣慰。

本文纯安装速记与关键点记录,适合有一定经验且对前端React及生态有一些小了解,想要快速的将一个框架搭建起来的童鞋。可当成一个指引。

Node.js环境安装

本地搭建可支持多个Node.js版本切换的工具。这里笔者使用的工具是NVM。该工具支持多种操作系统,目前以windoows为例来说明。

tip: NVM用于切换多个node版本,比node要先安装,后面node由nvm来安装。

NVM安装

进入官网http://nvm.uihtm.com/ 下载

解压下载,双击安装

检查装情况, 在控制台输入 nvm version,有版本输出即说明安装成功。

nvm version# ---
# Running version 1.1.10.

tip: 安装之后,会自动生成两个环墒变量: NVM_HOME和NVM_SYNLINK, 指定安装路径以及Node关联路径。

用nvm安装nodejs

# 查询可获得的版本列表
nvm list available  # 安装指定版本的node
nvm install node16
nvm install node18
nvm install node2?

注意事项: 一定要先安装nvm,如果后端版本切换会不成功,请多试几次,比如卸掉node重来一遍。

常用功能

列出在用版本
nvm list # 带*号和"Currently ...)为当前在用nodejs
# 控制台输出  
# 18.18.0  
# * 16.20.2 (Currently using 64-bit executable)  
#  14.21.3  
版本切换
nvm use 16# 切换到第 16版

前端框架速搭

起步: node > pnpm + yarn

# 工具npm i -g pnpm yarn typescirpt
pnpm create vite my-react-app --template react-ts
cd my-react-app
pnpm install

笔记最爱yarn,目前pnpm性能高出好几倍,所以两个会一起用。

必备组件

安装
#ant-design 
pnpm add antd @ant-design/icons### atailwind css
pnpm add -D tailwindcss postcss autoprefixer 
npx tailwindcss init ## 
pnpm i crypto-js 
pnpm i axios
pnpm i react-redux react-router-dom ## 优化器与path
pnpm i vite-plugin-optimizer path -D## 改变控制台颜色 -- 用于vitePluginStart.ts插件-在控制打印输出Ascii图
pnpm i picocolors
配置-tailwind.config.js
/** @type {import('tailwindcss').Config} */module.exports = {content: ["./index.html","./src/**/*.{html,js,ts,jsx,tsx}"],theme: {screens: {xs: '457px',sm: '480px',md: '768px',lg: '976px',xl: '1440px',},colors:{transparent: 'transparent',current: 'currentColor',dark: 'rgba(0, 0, 0, 0.88)',primaryColor: '#13ce66','white': '#ffffff','blue': '#1fb6ff','purple': '#7e5bef','pink': '#ff49db','orange': '#ff7849','green': '#13ce66','yellow': '#ffc82c','gray-dark': '#273444','gray': '#8492a6','gray': '#8495ff','gray-light': '#d3dce6',},fontFamily: {sans: ['Graphik', 'sans-serif'],serif: ['Merriweather', 'serif'],},extend: {borderColor: '#c2c8d1',spacing: {'128': '32rem','144': '36rem',},borderRadius: {'4xl': '2rem',}},},plugins: [],
}
配置index.css
@tailwind base;
@tailwind components;
@tailwind utilities;# extra 内容:root {--border-color: #c2c8d1;--primary-color: #13ce66
}/* pc 宽度大于1200px */
@media screen and (min-width: 1200px){}/* 平板 小于1199 大于501px*/
@media screen and (max-width: 1199px)  and (min-width: 501px) {}/* 手机 最大500px*/
@media screen and (max-width: 500px) {}.border-solid {border: 1px solid var(--border-color);
}
.border-radius {border-radius: 20px;
}.border-right {border: 1px solid  var(--border-color);
}
创建plugin vitePluginStart.ts

import type { PluginOption, ViteDevServer } from 'vite';
import colors from 'picocolors';export default function vitePluginVueMonitor (): PluginOption  {return {name: 'ts-start',apply: 'serve',enforce: 'pre',configureServer(server: ViteDevServer) {const print = server.printUrls;server.printUrls = () => {const network = server.resolvedUrls?.network[0];const local = server.resolvedUrls?.local[0];if (!network && !local) {console.log(colors.red('获取IP地址失败,请检查vite.config.ts文件中server.host配置是否正确!\n'))} else {console.info(colors.green("Hello World"))print();}}}}
}
配置vite.config
import react from '@vitejs/plugin-react'
import { defineConfig } from 'vite'
import path from 'path';
import optimizer from 'vite-plugin-optimizer'// # 控制台输出
// 注意这里千万不要使用@,因为这里还不能识别你配置文件系统路径别名
import vitePluginStart from './src/plugin/vitePluginStart.ts'export default defineConfig({plugins: [react(),optimizer({child_process: () => ({find: /^(node:)?child_process$/,code: `const child_process = import.meta.glob('child_process'); export { child_process as default }`})}),vitePluginStart(),],resolve: {alias: {'@': path.resolve(__dirname, 'src'),'@assets': path.join(__dirname, 'src/assets'),}},server: {host: '0.0.0.0', // 指定服务器应该监听哪个 IP 地址port: 5173, // 指定开发服务器端口strictPort: true, // 若端口已被占用则会直接退出open: false, // 启动时自动在浏览器中打开应用程序}
})
配置 tsconfig.json
{"compilerOptions": {"target": "ES2020","useDefineForClassFields": true,"lib": ["ES2020", "DOM", "DOM.Iterable","WebWorker"],"module": "ESNext","skipLibCheck": true,/* Bundler mode */"moduleResolution": "bundler","allowImportingTsExtensions": true,"resolveJsonModule": true,"isolatedModules": true,"noEmit": true,"jsx": "react-jsx",/* Linting */"strict": true,"noUnusedLocals": false,"noUnusedParameters": false,"noFallthroughCasesInSwitch": true,"allowSyntheticDefaultImports": true,"noImplicitAny": false,"baseUrl": "./","paths": {"@/*": ["src/*"]},"types": ["vite/client", "jest", "@testing-library/jest-dom"]},"include": ["src"],"references": [{ "path": "./tsconfig.node.json" }]
}
配置 .gitignore
.DS_Store
node_modules
dist
.npmrc
.cacheyarn.lock
package-lock.jsontests/server/static
tests/server/static/upload
test/unit/coverage
test/e2e/reports.local
# local env files
.env.local
.env.*.local
.eslintcache# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
selenium-debug.log
pnpm-debug.log*# Editor directories and files
.idea
# .vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
修改 App.tsx

去掉app.css

import React from 'react'
import {ConfigProvider} from "antd";function App() {return (<><ConfigProvidertheme={{token: {colorPrimary: '#13ce66',colorBorderSecondary: '#c2c8d1',colorBgContainer: 'rgba(246,255,237,0)',},}}><button  className={"bg-gray"} onClick={()=>{alert("hello world")}}>click me</button></ConfigProvider></>)
}export default App
启动框架,测试效果
pnpm start

代码规范组件 - eslint + prettier + husky

  • eslint (https://github.com/eslint/eslint) JavaScript 代码检测工具,检测并提示错误或警告信息
  • prettier (https://github.com/prettier/prettier) 代码自动化格式化工具,更好的代码风格效果
  • husky (https://github.com/typicode/husky) Git hooks 工具, 可以在执行 git 命令时,执行自定义的脚本程序
安装
# eslint -->  .eslintrc.cjs
pnpm add -D eslint eslint-config-react-app
npm init @eslint/config# Prettier prettier 是一个代码格式化工具 - prettierrc.cjs ,
pnpm add -D prettier eslint-config-prettier @trivago/prettier-plugin-sort-imports  eslint-plugin-prettier# 创建配置文件 -- 配置后谈
npm init @eslint/config
touch .eslintrc.cjs
touch .prettierrc.cjs# husky
pnpm add -D  husky
pnpm pkg set scripts.prepare="husky install"
git init
pnpm prepare
npx husky add .husky/pre-commit "npm run lint"
配置 .eslintrc.cjs – eslint
  1. 添加.eslintrc.cjs文件
module.exports = {extends: ['react-app', 'prettier'],
};
配置.prettierrc.cjs

创建.prettierrc.cjs

module.exports = {singleQuote: true,importOrder: ['^vite','^react','^antd','<THIRD_PARTY_MODULES>','components/','pages/','hooks/','utils/','^[./]',],importOrderSortSpecifiers: true,importOrderGroupNamespaceSpecifiers: true,importOrderCaseInsensitive: true    
};
测试
git add . 
git commit -m 'test husky'

工程测试

pnpm dev

WebAssembly - 可选

mkdir assembly
cd assembly

见笔者的另外文章 [Emscripten编译c/c++为WebAssembly](https://juejin.cn/post/7285538670608810043)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/220016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为OD机试 - 高效货运(Java JS Python C)

题目描述 老李是货运公司承运人,老李的货车额定载货重量为 wt。 现有两种货物: 货物 A 单件重量为 wa,单件运费利润为 pa货物 B 单件重量为 wb,单件运费利润为 pb老李每次发车时载货总重量刚好为货车额定的载货重量 wt,车上必须同时有货物 A 和货物 B ,货物A、B不可切割…

javaWebssh汽车销售管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh汽车销售管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7.…

redis-学习笔记(Jedis zset 简单命令)

zadd & zrange zadd , 插入的第一个参数是 zset , 第二个参数是 score, 第三个参数是 member 成员 内部依据 score 排序 zrange 返回 key 对应的 对应区间内的值 zrangeWithScore 返回 key 对应的 对应区间内的值和分数 示例代码 zcard 返回 key 对应的 zset 的长度 示例代…

05-命令模式

意图&#xff08;GOF定义&#xff09; 将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户端进行参数化&#xff0c;对请求排队或者记录日志&#xff0c;以及可支持撤销的操作。 理解 命令模式就是把一些常用的但比较繁杂的工作归类为成一组一组的动作&…

旅游管理虚拟情景实训教学系统演示

首先&#xff0c;虚拟情景实训教学系统为旅游管理专业的学生提供了一个全新的实践平台。在传统的旅游管理教学中&#xff0c;学生往往只能通过理论学习来了解相关知识&#xff0c;而无法亲身实践。虚拟情景实训教学系统则可以通过模拟真实的旅游场景&#xff0c;让学生能够亲身…

Linux环境下maven的安装

到官网下载maven 步入下面的地址选择合适的maven版本 https://dlcdn.apache.org/maven/ 以笔者为例&#xff0c;选择了3.5.4这个版本 将maven上传到Linux服务器并解压 tar -zxvf apache-maven-3.5.4-bin.tar.gz配置环境变量 我们使用vim编辑profile vim /etc/profile环境…

【数据结构(十一·多路查找树)】B树、B+树、B*树(6)

文章目录 1. 二叉树 与 B树1.1. 二叉树存在的问题1.2. 多叉树 的概念1.3. B树 的基本介绍 2. 多叉树——2-3树2.1. 基本概念2.2. 实例应用2.3. 其他说明 3. B 树、B树 和 B*树3.1. B树 的介绍3.2. B树 的介绍3.2. B*树 的介绍 1. 二叉树 与 B树 1.1. 二叉树存在的问题 二叉树…

react Hooks(useEffect)实现原理 - 简单理解

useEffect 语法&#xff1a; useEffect(setup, dependencies?) 含义: useEffect 是一个 React Hook&#xff0c;它允许你 将组件与外部系统同步。 useEffect 源码简单理解 一、mountEffect 和 upadateEffect useEffect 与其它 hooks 一样分为 mountEffect 和 upadateEffec…

I2C总线通信(温湿度实验)

1.使能GPIOF时钟 2.将PF14设置为输出&#xff0c;PF15也可以先设置为输出 3.设置输出速度最高档位速度 4.SI7006的初始化 5.读取温度、湿度 6.将读取到的温度湿度数据通过计算公式进行转换 7.将结果输出 main.c #include "si7006.h"extern void printf(cons…

linux bash shell变量操作符 —— 筑梦之路

1. 变量子串 ${var} 返回变量var的内容&#xff0c;单独使用时有没有{}一样&#xff0c;混合多个变量和常量时&#xff0c;用{}界定变量名 ${#var} 返回变量var内容的长度 ${var:offset} 从变量var中的偏移量offset开始截取到字符串结尾的子字符串&#xff0c;offset从0开始 ${…

工科数学分析(华南理工大学)

旷了三天课&#xff0c;估计要被薄纱了这下&#xff08;&#xff09; ----------------引言 第一节 集合与实数集 比较重要的是实数具有稠密性。 即在两个实数之间存在无穷个其他实数&#xff0c; 然后是绝对值不等式 第一个经常用来放缩不等式&#xff0c;证明极限 第二…

DENet:用于可见水印去除的Disentangled Embedding网络笔记

1 Title DENet: Disentangled Embedding Network for Visible Watermark Removal&#xff08;Ruizhou Sun、Yukun Su、Qingyao Wu&#xff09;[AAAI2023 Oral] 2 Conclusion This paper propose a novel contrastive learning mechanism to disentangle the high-level embedd…

Debian 系统镜像下载

最近在看一些网络相关的文章需要用到 debian 11.x 的系统网上找了好多都发下载&#xff0c;在官网看一下 有个 11.8 的版本我无法下载&#xff0c;提示被最新的 debian-12.4.0 所代替&#xff0c;于是找到了这个链接 Index of /cdimage/unofficial/non-free/cd-including-fi…

imazing是什么软件

imazing是什么软件 iMazing 是世界上最值得信赖的软件,可以将您的信息、音乐、文件和数据从 iPhone 或 iPad 传输到您的 Mac 或 PC。 获得备份、数据提取、媒体和文件传输的强大能力,以及更多 iMazing 功能。 iMazing是一款第三方的苹果iOS设备管理软件。 iMazing- 2 Mac-安装…

web前端之若依开发经验

MENU 前言创建路由的细节 前言 1、官网地址 2、在线文档 3、演示地址 4、代码下载 5、野生版的若依开发文档 创建路由的细节 1、从系统管理进入菜单管理页面创建菜单&#xff0c;菜单创建成功后刷新页面&#xff0c;然而刚刚创建的菜单并不会出现。 2、解决创建完菜单不显示问题…

【计算机网络基础4】UDP协议、DNS协议、NAT协议、DHCP协议和HTTP协议

1、UDP协议 UDP用户数据报协议&#xff0c;是面向无连接的通讯协议&#xff0c;UDP数据包括目的端口号和源端口号信息&#xff0c;由于通讯不需要连接&#xff0c;所以可以实现广播发送。 UDP通讯时不需要接收方确认&#xff0c;属于不可靠的传输&#xff0c;可能会出现丢包现…

死锁(面试常问)

1.什么是死锁 简单来说就是一个线程加锁后解锁不了 一个线程&#xff0c;一把锁&#xff0c;线程连续加锁两次。如果这个锁是不可重入锁&#xff0c;会死锁。两个线程&#xff0c;两把锁。 举几个例子&#xff0c;1.钥匙锁车里了&#xff0c;车钥匙锁家里了。2. 现在有一本书…

slot的理解

一. 什么是slot? 在Vue中&#xff0c;slot 是一种用于在组件之间进行内容分发的机制。它允许我们在组件的模板中定义具有特定名称的插槽&#xff0c;并在组件的使用者中填充相应的内容。 二. 使用场景 通过插槽可以让用户可以拓展组件&#xff0c;去更好地复用组件和对其做定…

在 Qt Creator 中编写 Doxygen 风格的注释

2023年12月10日&#xff0c;周日上午 如何生成Doxygen 风格的注释 在需要Doxygen 风格注释的函数上方输入 /**&#xff0c;然后按下 Enter 键。Qt Creator 将自动为你生成一个注释模板。 输入&#xff0c;Qt Creator会自动帮你补全Doxygen标签 不得不说&#xff0c;写了Doxyge…

Re58:读论文 REALM: Retrieval-Augmented Language Model Pre-Training

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文名称&#xff1a;REALM: Retrieval-Augmented Language Model Pre-Training 模型名称&#xff1a;Retrieval-Augmented Language Model pre-training (REALM) 本文是2020年ICML论文&#xff0c;作者来自…