vue3代码规范管理;基于vite和vue3、 eslint、prettier、stylelint、husky规范;git触发eslint校验

前言

为提高前端代码格式化和规范开发。主要使用eslint、prettier、husky完成对git提交commit信息校验和代码eslint格式化校验,不符合要求的代码,提交不到仓库。


参考链接1
参考链接2

文章目录

  • 前言
  • 一、效果图
    • 1.git提交触发eslint规范校验
    • 2.版本与分支名不一致校验
    • 3.commit提交不规范校验
    • 4.代码提交规范相关介绍
  • 二、Prettier准备
    • 1.安装Prettier
    • 2.安装对应插件
    • 3.配置
    • 4.配置格式化
    • 5.保存自动格式化代码设置
  • 三、eslint准备
    • 1.安装eslint插件
    • 2.勾选
    • 3.安装eslint依赖
    • 4.根添加配置
    • 5.package.json添加校验命令
  • 四、git检查提交分支和package.json的version版本是否一致
    • 1.安装命令husky和lint-staged
    • 2.初始化
    • 3.创建校验脚本‌
    • 4.配置ckage.json
    • 5.更新 Husky 钩子‌
    • 6.测试版本不一致的提交效果
  • 五、支持eslint.config.js的解析
    • 1.原生语法解析(无就jsx、无ts)
    • 2.有jsx无ts
    • 3.有jsx有ts
  • 六、git提交规范化类型
    • 1.package.json添加命令和初始化husky
    • 2.安装
    • 3.配置git提交类型
    • 4.添加commit-msg
    • 5.测试git提交规范
  • 七、git提交触发eslint
    • 1.package.json修改
    • 2.测试git提交触发eslint
  • 八、最终结构
  • 九、eslint相关报错

一、效果图

1.git提交触发eslint规范校验

在这里插入图片描述

2.版本与分支名不一致校验

在这里插入图片描述

3.commit提交不规范校验

在这里插入图片描述

4.代码提交规范相关介绍

代码格式规范相关:

  • eslint:代码格式校验
  • prettier:prettier 主要是为了格式化代码,而在没有 prettier 之前,是用 eslint —fix和 编辑器自带代码格式来进行代码格式化的。
  • stylelint:css样式格式校验

代码提交规范相关:

  • lint-staged:一个在git暂存文件上运行linters的工具,检查本次修改更新的代码,并自动修复并且可以添加到暂存区
  • husky: 是一个Git Hook 工具。将其安装到所在仓库的过程中它会自动在 .git/ 目录下增加相应的钩子实现对应的功能,这里我们通过使用husky监测commit-msg钩子,完成提交信息校验监测 pre-commit 钩子,完成代码校验。
  • pre-commit:git hooks的钩子,在代码提交前检查代码是否符合规范,不符合规范将不可被提交
  • commit-msg:git hooks的钩子,在代码提交前检查commit信息是否符合规范
  • commitizen:git的规范化提交工具,帮助你填写commit信息,符合约定式提交要求
  • commitlint:用于检测提交的信息。

文档:

  • git规范提交文档
  • stylelint
  • eslint

二、Prettier准备

1.安装Prettier

Prettier是一个代码格式化工具,它可以自动调整代码的缩进、换行、引号等格式,使代码风格保持一致。与ESLint不同,Prettier主要关注代码的格式问题,而不是语法或逻辑错误。

npm install prettier --save-dev

package.json添加

  "scripts": {"prettier": "npx prettier . --write",},

2.安装对应插件

在这里插入图片描述

3.配置

.prettierignore忽略文件

.github
.husky
.vscode
/public/**
/node_modules/**
**/*.svg
**/*.sh

.prettierrc.cjs配置文件

module.exports = {printWidth: 200,tabWidth: 2,useTabs: false,semi: false,trailingComma: "none",singleQuote: false,bracketSpacing: true,jsxBracketSameLine: false,endOfLine: "auto",arrowParens: "avoid",singleAttributePerLine: false,htmlWhitespaceSensitivity: "ignore"
}

4.配置格式化

在vscode 的设置里面 找到代码格式化设置,设置为使用 prettier格式化代码
在这里插入图片描述

5.保存自动格式化代码设置

在这里插入图片描述

三、eslint准备

1.安装eslint插件

在这里插入图片描述

2.勾选

在这里插入图片描述

3.安装eslint依赖

pnpm add @eslint/js@9.8.0 eslint@9.8.0 eslint-plugin-vue@9.27.0 globals@15.8.0 --save-dev

4.根添加配置

.eslintignore

*.sh
*.md
*.woff
*.ttf
.vscode
.husky
.githubnode_modules
dist

eslint.config.js: 添加这个文件后才可以支持eslnt触发校验
这个文件的配置,具体可以看文章最后的 五、支持eslint.config.js的解析 内容

import globals from "globals"
import pluginJs from "@eslint/js"
import pluginVue from "eslint-plugin-vue"export default [{ files: ["**/*.{js,mjs,cjs,vue}"] }, // 注意范围{ languageOptions: { globals: { ...globals.browser, ...globals.node } } },pluginJs.configs.recommended,...pluginVue.configs["flat/essential"],{files: ["**/*.vue"],rules: {"vue/html-self-closing": "off","vue/multi-word-component-names": "off","vue/max-attributes-per-line": "off","vue/singleline-html-element-content-newline": "off","max-lines": ["error", { max: 500, skipBlankLines: true, skipComments: true }]}},{ignores: ["node_modules/*", "dist/*", "public/*"]}
]

5.package.json添加校验命令

5.1命令

  "scripts": {"prettier": "npx prettier . --write","lint": "npx eslint ."},

5.2执行npm run lint就会触发eslint的校验,看到eslint报错。
在这里插入图片描述

5.3同时页面应该也可以看到eslint的报错了。

  • 如果此时vscode看不到具体的页面的eslint报错,那就关闭项目,重启vscode。
  • 如果发现做了上述操作之后,还是没触发,那就把vscode的 eslint、prettier 扩展插件 卸载了重新安装,然后重启vscode,就可以解决了
    在这里插入图片描述

四、git检查提交分支和package.json的version版本是否一致

详细单独配置版本检查看此篇

husky操作git钩子的工具
lint-staged在提交前进行eslint校验,并使用prettier格式化暂存区的代码
@commitlint/cli校验提交信息
@commitlint/config-conventionalAngular 的提交规范
commitizen生成标准化的commit message
cz-git轻量级、高度自定义。输出标准格式的commitize 适配器

新增内容:
在这里插入图片描述

1.安装命令husky和lint-staged

npm install husky@9.1.4 lint-staged@15.2.9 --save-dev

2.初始化

npx husky-init && pnpm install

生成 .husky 目录及 pre-commit 钩子文件

3.创建校验脚本‌

在项目根目录新建 scripts/check-version.js:

import fs from "fs"
import { execSync } from "child_process"// 获取packageJson内容
const packageJson = JSON.parse(fs.readFileSync("package.json", "utf8"))// 获取当前分支名
const branchName = execSync("git rev-parse --abbrev-ref HEAD").toString().trim()if (!branchName.includes(packageJson.version)) {console.error(`版本 ${packageJson.version} 与分支名称 ${branchName} 不一致,不允许提交`)process.exit(1)
}

4.配置ckage.json

配置lint-staged‌,添加校验:
注意此时仅仅校验版本,没有校验eslint

  "scripts": {"prepare": "husky install"},"lint-staged": {"*.{js,jsx,ts,tsx}": ["prettier --write"],"*.vue": ["prettier --write"]}

5.更新 Husky 钩子‌

修改 .husky/pre-commit:

npx lint-staged
node scripts/check-version.js

6.测试版本不一致的提交效果

在这里插入图片描述

五、支持eslint.config.js的解析

1.原生语法解析(无就jsx、无ts)

import globals from "globals"
import pluginJs from "@eslint/js"
import pluginVue from "eslint-plugin-vue"export default [{ files: ["**/*.{js,mjs,cjs,vue}"] }, // 注意范围{ languageOptions: { globals: { ...globals.browser, ...globals.node } } },pluginJs.configs.recommended,...pluginVue.configs["flat/essential"],{files: ["**/*.vue"],rules: {"vue/html-self-closing": "off","vue/multi-word-component-names": "off","vue/max-attributes-per-line": "off","vue/singleline-html-element-content-newline": "off","max-lines": ["error", { max: 500, skipBlankLines: true, skipComments: true }]}},{ignores: ["node_modules/*", "dist/*", "public/*"]}
]

2.有jsx无ts

报错:jsx报错Parsing error: Unexpected token <eslint
在这里插入图片描述

安装依赖

npm install vue-eslint-parser --save-dev
import globals from "globals"
import pluginJs from "@eslint/js"
import pluginVue from "eslint-plugin-vue"
import babelParser from "vue-eslint-parser"; // 显式导入解析器对象-否则引入报错export default [{files: ["**/*.{js,jsx,vue}"], // 注意范围languageOptions: {// 正确引用解析器对象(非字符串)parser: babelParser,parserOptions: {ecmaVersion: "latest",sourceType: "module",ecmaFeatures: { jsx: true }},globals: { ...globals.browser, ...globals.node }}},pluginJs.configs.recommended,...pluginVue.configs["flat/essential"],{files: ["**/*.vue"],rules: {"vue/html-self-closing": "off","vue/multi-word-component-names": "off","vue/max-attributes-per-line": "off","vue/singleline-html-element-content-newline": "off","max-lines": ["error", { max: 500, skipBlankLines: true, skipComments: true }]}},{ignores: ["node_modules/*", "dist/*", "public/*"]}
]

3.有jsx有ts

  • 我的这里比较特殊,最初有jsx和ts代码时候,没有安装@typescript-eslint/parser@typescript-eslint/eslint-plugin这两个插件时候,ts的代码是会报Parsing error: Unexpected token {eslint问题。
  • 但是当我安装下面两个依赖后,eslint.config.js继续使用2.有jsx无ts的配置时,发现ts的报错也没了。。。
  • 原因:files: ["**/*.{js,jsx,ts,tsx,vue}"],漏了写ts,tsx
  • 正确解决问题的方式如下

安装依赖

npm install @typescript-eslint/parser @typescript-eslint/eslint-plugin --save-dev

注意:project: "./tsconfig.json"的路径

import globals from "globals";
import pluginJs from "@eslint/js";
import pluginVue from "eslint-plugin-vue";
import vueParser from "vue-eslint-parser";
import tsParser from "@typescript-eslint/parser"; // 导入 TS 解析器
import tsEslintParser from "@typescript-eslint/eslint-plugin"; // 导入 TS 解析器export default [// 核心配置{files: ["**/*.{js,jsx,ts,tsx,vue}"], // 注意范围languageOptions: {// 主解析器:处理 Vue 文件parser: vueParser,parserOptions: {// 子解析器:处理非 Vue 文件(TS/JS)parser: {js: tsParser, // 处理 JS/JSXts: tsParser, // 处理 TS/TSXjsx: tsParser,tsx: tsParser},ecmaVersion: "latest",sourceType: "module",ecmaFeatures: { jsx: true },// 关联 tsconfig.json(路径根据实际项目调整)project: "./tsconfig.json" // 【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【注意这里路径调整,没有ts配置文件就注释掉该行】】】】】】】】】】】】】】】】】】】】】】】】】】】】】】】】】】】】】},globals: { ...globals.browser, ...globals.node }}},// 应用推荐规则pluginJs.configs.recommended,// Vue3 配置...pluginVue.configs["flat/essential"],// TypeScript 配置{plugins: {"@typescript-eslint": tsEslintParser},rules: {// "@typescript-eslint/no-unused-vars": "warn" // 示例规则}},// 自定义规则{files: ["**/*.vue"],rules: {"vue/html-self-closing": "off","vue/multi-word-component-names": "off","vue/max-attributes-per-line": "off","vue/singleline-html-element-content-newline": "off","max-lines": ["error", { max: 500, skipBlankLines: true, skipComments: true }]}},// 忽略文件{ignores: ["node_modules/*", "dist/*", "public/*"]}
]

六、git提交规范化类型

规范提交文档

1.package.json添加命令和初始化husky

package.json至少要有这些配置

  "scripts": {"prettier": "npx prettier . --write","prepare": "husky install","commitlint": "commitlint --edit"},"husky": {"hooks": {"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"}},"lint-staged": {"*.{js,jsx,ts,tsx}": ["prettier --write"],"*.vue": ["prettier --write"]}

执行npm run prepare,初始化husky的文件
在这里插入图片描述

2.安装

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

3.配置git提交类型

根目录配置:commitlint.config.js

const config = {ignores: [commit => commit.includes("init")],rules: {"header-max-length": [2, "always", 100],"scope-case": [2, "always", "lowerCase"],"subject-empty": [2, "never"],"subject-case": [2, "always", ["lower-case", "sentence-case", "start-case", "pascal-case", "upper-case"]],"subject-full-stop": [2, "never", "."],"type-empty": [2, "never"],"type-case": [2, "always", "lowerCase"],"type-enum": [2, "always", ["feat", "fix", "style", "perf", "docs", "refactor", "test"]]}
}export default config

4.添加commit-msg

在.husky/下新增commit-msg
在这里插入图片描述

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
commit_msg=$(cat "$1")
new_commit_msg=$(echo "$commit_msg" | sed 's/^:[^:]*: //')
echo "$new_commit_msg" > "$1"
pnpm commitlint ${1}

5.测试git提交规范

在这里插入图片描述

七、git提交触发eslint

注意:只是针对当前新增的缓存区文件,触发eslint;历史提交成功的文件,eslint就不校验了。可以通过npm run eslint去单独触发,单独依次修改掉

1.package.json修改

在上述所有步骤的基础上加上"eslint --fix",

  "lint-staged": {"*.{js,jsx,ts,tsx}": ["eslint --fix","prettier --write"],"*.vue": ["eslint --fix","prettier --write"]}

2.测试git提交触发eslint

在这里插入图片描述

八、最终结构

在这里插入图片描述
package.json配置

{"name": "jg-risk-detection-web","private": true,"version": "develop_eslint","type": "module","scripts": {"dev": "pnpm setName && vite --mode beta --host","setName": "node auto-set-component-name.mjs","develop": "vite build --mode develop","test": "vite build --mode test","online": "vite build --mode online","build": "vite build","build:electron": "vite build --mode electron","build:prod": "pnpm test && pnpm build:electron","preview": "vite preview","prettier": "npx prettier . --write","prepare": "husky install","lint": "npx eslint .","commitlint": "commitlint --edit"},"dependencies": {"@antv/g6": "^4.8.24","@element-plus/icons-vue": "^2.3.1","@jg/jg-ui": "^0.0.1","@vueuse/core": "^10.11.1","@web/jg-plugin": "^0.0.34","@xterm/addon-fit": "^0.10.0","@xterm/xterm": "^5.5.0","axios": "^1.6.8","dayjs": "^1.11.10","echarts": "^5.4.3","element-plus": "2.8.4","element-resize-detector": "^1.2.4","fast-glob": "^3.3.2","highlight.js": "^11.10.0","lodash": "^4.17.21","pinia": "^2.1.7","pinia-plugin-persist": "1.0.0","pinia-plugin-persistedstate": "^3.2.1","sortablejs": "^1.15.6","vite-plugin-svg-icons": "^2.0.1","vue": "^3.4.21","vue-diff": "^1.2.4","vue-draggable-plus": "^0.6.0","vue-router": "4","vxe-pc-ui": "4.3.82","vxe-table": "4.9.29"},"devDependencies": {"@commitlint/cli": "^19.8.0","@commitlint/config-conventional": "^19.8.0","@eslint/js": "9.8.0","@typescript-eslint/eslint-plugin": "^8.31.0","@typescript-eslint/parser": "^8.31.0","@vitejs/plugin-vue": "^5.0.4","@vitejs/plugin-vue-jsx": "^4.0.1","eslint": "^9.8.0","eslint-plugin-vue": "^9.27.0","globals": "15.8.0","gm-crypt": "^0.0.2","gm-crypto": "^0.1.12","husky": "^9.1.4","lint-staged": "^15.2.9","prettier": "3.2.5","sass": "1.65.1","unplugin-auto-import": "^0.17.5","unplugin-vue-components": "^0.26.0","unplugin-vue-define-options": "^1.4.2","vite": "^5.2.0","vite-plugin-lazy-import": "^1.0.7","vue-eslint-parser": "^10.1.3"},"husky": {"hooks": {"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"}},"lint-staged": {"*.{js,jsx,ts,tsx}": ["eslint --fix","prettier --write"],"*.vue": ["eslint --fix","prettier --write"]}
}

九、eslint相关报错

链接

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

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

相关文章

GCC 内建函数汇编展开详解

1. 引言 GNU 编译器集合&#xff08;GCC&#xff09;是广泛使用的开源编译器套件&#xff0c;支持多种编程语言&#xff0c;其中 C 语言编译器是其核心组件之一。在 C 语言编译过程中&#xff0c;GCC 不仅处理用户编写的标准 C 代码&#xff0c;还提供了一类特殊的函数——内建…

uniapp利用生命周期函数实现后台常驻示例

在 Uniapp 中&#xff0c;利用生命周期函数实现“后台常驻”主要是通过监听应用的前后台状态变化&#xff08; onHide 和 onShow &#xff09;&#xff0c;并结合 定时器、后台任务或状态保持逻辑 来实现。但需注意&#xff1a; 纯前端 JS 代码无法突破系统对后台应用的限制&am…

layui时间范围

//时间范围String time_range para.getString("time_range", "");if (!StrUtil.isEmpty(time_range)) {String dateArr[] time_range.split("-");if (dateArr.length 2) {para.put("start_date", dateArr[0].trim().replace("…

入门版 鸿蒙 组件导航 (Navigation)

入门版 鸿蒙 组件导航 (Navigation) 注意&#xff1a;使用 DevEco Studio 运行本案例&#xff0c;要使用模拟器&#xff0c;千万不要用预览器&#xff0c;预览器看看 Navigation 布局还是可以的 效果&#xff1a;点击首页&#xff08;Index&#xff09;跳转到页面&#xff08…

VUE3:封装一个评论回复组件

之前用React封装的评论回复组件&#xff0c;里面有三个主要部分&#xff1a;CommentComponent作为主组件&#xff0c;CommentItem处理单个评论项&#xff0c;CommentInput负责输入框。现在需要将这些转换为Vue3的组件。 Vue3和React在状态管理上有所不同&#xff0c;Vue3使用r…

制作一款打飞机游戏27:精灵编辑器UI

继续开发我们的编辑器——Sprit Edit。我们已经创建了这个小编辑器&#xff0c;它可以显示很多精灵&#xff08;sprites&#xff09;&#xff0c;并且我们可以遍历所有精灵。这真的很棒&#xff0c;我们可以创建新的精灵&#xff0c;这也不错。但是&#xff0c;唉&#xff0c;我…

k8s(9) — zookeeper集群部署(亲和性、污点与容忍测试)

一、部署思路 1、前期设想 zookeeper集群至少需要运行3个pod集群才能够正常运行&#xff0c;考虑到节点会有故障的风险这个3个pod最好分别运行在&#xff13;个不同的节点上(为了实现这一需要用到亲和性和反亲和性概念)&#xff0c;在部署的时候对zookeeper运行的pod打标签加…

WXT+Vue3+sass+antd+vite搭建项目开发chrome插件

WXTVue3sassantdvite搭建项目开发chrome插件 前言一、初始化项目二、项目配置调整三、options页面配置四、集成antd五、集成sass六、环境配置七、代码注入 vue3&#xff1a;https://cn.vuejs.org/ axios&#xff1a;https://www.axios-http.cn/docs/api_intro antd&#xff1a;…

JSAPI2.4——正则表达式

一、语法 const str 一二三四五六七八九十 //判断内容 const reg /二/ //判断条件 console.log(reg.test(str)); //检查 二、test与exec方法的区别 test方法&#xff1a;用于判断是否符合规则的字符串&#xff0c;返回值是布尔值 exec方法&…

燃气用户检修工考试精选题

燃气用户检修工考试精选题&#xff1a; 我国国家标准规定民用天然气中硫化氢含量最高允许浓度是&#xff08; &#xff09;。 A. 20mg/m B. 15mg/m C. 5mg/m D. 50mg/m 答案&#xff1a;A 城市燃气应具有可以察觉的臭味&#xff0c;当无毒燃气泄漏到空气中&#xff0c;达到爆炸…

【前端】1h 搞定 TypeScript 教程_只说重点

不定期更新&#xff0c;建议关注收藏点赞。 目录 简介使用基本类型、类型推断和类型注解接口、类型别名、联合类型类与继承泛型GenericsReact 与 TS 进阶高级类型装饰器Decorators模块系统TypeScript 编译选项 简介 TypeScript&#xff08;简称 TS&#xff09;是一种由微软开发…

MyBatis 参数绑定

一、MyBatis 参数绑定机制 1.1 核心概念 当 Mapper 接口方法接收多个参数时&#xff0c;MyBatis 提供三种参数绑定方式&#xff1a; 默认参数名&#xff1a;arg0、arg1&#xff08;Java 8&#xff09;或 param1、param2Param 注解&#xff1a;显式指定参数名称POJO/DTO 对象…

【解决方案】Linux解决CUDA安装过程中GCC版本不兼容

Linux解决CUDA安装过程中GCC版本不兼容 目录 问题描述 解决方法 安装后配置 问题描述 Linux环境下安装 CUDA 时&#xff0c;运行sudo sh cuda_10.2.89_440.33.01_linux.run命令出现 “Failed to verify gcc version.” 的报错&#xff0c;提示 GCC 版本不兼容&#xff0c;查…

人工智能数学基础(一):人工智能与数学

在人工智能领域&#xff0c;数学是不可或缺的基石。无论是算法的设计、模型的训练还是结果的评估&#xff0c;都离不开数学的支持。接下来&#xff0c;我将带大家深入了解人工智能数学基础&#xff0c;包括微积分、线性代数、概率论、数理统计和最优化理论&#xff0c;并通过 P…

Shell脚本-嵌套循环应用案例

在Shell脚本编程中&#xff0c;嵌套循环是一种强大的工具&#xff0c;可以用于处理复杂的任务和数据结构。通过在一个循环内部再嵌套另一个循环&#xff0c;我们可以实现对多维数组、矩阵操作、文件处理等多种高级功能。本文将通过几个实际的应用案例来展示如何使用嵌套循环解决…

勘破养生伪常识,开启科学养生新篇

​在养生潮流风起云涌的当下&#xff0c;各种养生观点和方法层出不穷。但其中有不少是缺乏科学依据的伪常识&#xff0c;若不加分辨地盲目跟从&#xff0c;不仅难以实现养生目的&#xff0c;还可能损害健康。因此&#xff0c;勘破这些养生伪常识&#xff0c;是迈向科学养生的关…

Nacos-3.0.0适配PostgreSQL数据库

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

机器学习第三篇 模型评估(交叉验证)

Sklearn:可以做数据预处理、分类、回归、聚类&#xff0c;不能做神经网络。原始的工具包文档&#xff1a;scikit-learn: machine learning in Python — scikit-learn 1.6.1 documentation数据集:使用的是MNIST手写数字识别技术&#xff0c;大小为70000&#xff0c;数据类型为7…

如何在 IntelliJ IDEA 中编写 Speak 程序

在当今数字化时代&#xff0c;语音交互技术越来越受到开发者的关注。如果你想在 IntelliJ IDEA&#xff08;一个强大的集成开发环境&#xff09;中编写一个语音交互&#xff08;Speak&#xff09;程序&#xff0c;那么本文将为你提供详细的步骤和指南。 一、环境准备 在开始编…

AI大模型学习十四、白嫖腾讯Cloud Studio AI环境 通过Ollama+Dify+DeepSeek构建生成式 AI 应用-接入DeepSeek大模型

一、说明 需要阅读 AI大模型学习十三、白嫖腾讯Cloud Studio AI环境 通过OllamaDifyDeepSeek构建生成式 AI 应用-安装-CSDN博客https://blog.csdn.net/jiangkp/article/details/147580344?spm1011.2415.3001.5331 我们今天干点啥呢&#xff0c;跟着官网走 模型类型 在 Dify…