小兔鲜电商项目实战--Vue3实战--黑马--项目起步①

免责声明(doge):

这是本人学习前端vue3,跟着B站黑马程序员的配套课程,vue3小兔鲜电商项目,跟着做的课堂笔记(其实就是对其配套课程中的md文档,进行的修改完善,及个人学习体会和心得。想观看完整视频,可以去B站看黑马程序员的课程:黑马程序员前端Vue3小兔鲜电商项目实战

黑马配套源码和笔记资料:小兔鲜项目资料

本人才疏学浅,本只是想拿这里当笔记用,移动端、电脑端都能同步,复习起来也方便,也欢迎各位大佬共同交流学习。

这是①-项目起步,对应的配套资料中的“笔记”的3-项目起步,点我主页还有。

接口文档:

接口文档,奉上:必须先读 - 黑马前端

创建项目并整理目录

npm init vue@latest

npm要求包名必须全小写且不含特殊字符允许连字符(-)和下划线(_)。当使用npm init vue@latest创建项目时,若输入的项目名含大写字母(如MyApp),脚手架会检测到不符合npm命名规范,需通过二次询问获取合法包名(如my-app)。全小写命名(如myapp)直接通过验证,故不再询问。

image.png

src目录调整

新建5个文件夹(都要加s)

  1. apis ----- API接口文件夹

  2. composables ----- 组合函数文件夹

  3. directives ----- 全局指令文件夹

  4. styles ----- 全局样式文件夹

  5. utils ----- 工具函数文件夹

git提交

基于 create-vue 创建出来的项目默认没有初始化git仓库,需要我们手动初始化

执行命令并完成首次提交

  1. git init(仅第一次)

  2. git add .

  3. git commit -m “init”

(备注:已经有终端在运行项目,npm run dev,这时,不要结束其运行,再新建一个终端就好了

jsconfig.json配置别名路径

(尽量不要看此笔记,知道要干什么,去element官网思考怎么做)

配置别名路径可以在写代码时联想提示路径

{
  "compilerOptions": {
    "baseUrl": "./",
    "paths": {
      "@/*": [
        "src/*"
      ]
    }
  }
}

去App.vue中,把./ 换成 @/ 就可以看到,有联想路径功能(如果没有,重启VScode试试)

git提交

elementPlus引入

(去官网,不要复制下面的走捷径,去element官网)

1. 安装elementPlus和自动导入插件

npm i elementPlus
npm install -D unplugin-vue-components unplugin-auto-import

(备注:可以在package.json看到新增的行(在最左边,绿色代表该行是新增的行)新增的行,说明elementPlus和插件安装成功)

2. 配置自动按需导入

在根目录下的vite.config.js,添加修改如下代码:

// 引入插件
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
​
​
export default defineConfig({
  plugins: [
    // 配置插件
    AutoImport({
      resolvers: [ElementPlusResolver()],
    }),
    Components({
      resolvers: [ElementPlusResolver()],
    }),
  ]
})

3. 测试组件

可以在App.vue中,添加以下代码(原来一大串代码可删除,因为这只是为了测试组件是否生效,测试完毕,再Ctrl Z即可)

<template>
  <el-button type="primary">i am button</el-button>
</template>

git提交

定制elementPlus主题

1. 安装sass

基于vite的项目默认不支持css预处理器,需要开发者单独安装

npm i sass -D

2. 准备定制化的样式文件

写入路径为: @/styles/element/index.scss(这里都是UI设计师提供的颜色)(是scss,不是css)

/* 只需要重写你需要的即可 */
@forward 'element-plus/theme-chalk/src/common/var.scss' with (
  $colors: (
    'primary': (
      // 主色
      'base': #27ba9b,
    ),
    'success': (
      // 成功色
      'base': #1dc779,
    ),
    'warning': (
      // 警告色
      'base': #ffb302,
    ),
    'danger': (
      // 危险色
      'base': #e26237,
    ),
    'error': (
      // 错误色
      'base': #cf4444,
    ),
  )
)

3. 自动导入配置

这里自动导入需要深入到elementPlus的组件中,按照官方的配置文档来

  1. 自动导入定制化样式文件进行样式覆盖,

  2. 按需定制主题配置 (需要安装 unplugin-element-plus)

路径:@/vite.config.js

import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

// elementPlus按需导入
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    // ...
    AutoImport({
      resolvers: [ElementPlusResolver()],
    }),
    Components({
      resolvers: [
        // 1. 配置elementPlus采用sass样式配色系统
        ElementPlusResolver({ importStyle: "sass" }),
      ],
    }),
  ],
  resolve: {
    // 实际的路径转换  @  -> src
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  },
  css: {
    preprocessorOptions: {
      scss: {
        // 2. 自动导入定制化样式文件进行样式覆盖
        additionalData: `
          @use "@/styles/element/index.scss" as *;
        `,
      }
    }
  }
})

git提交

axios安装并简单封装

前言:为什么要配置?(理论)

  1. 减少重复代码: 通过配置 baseURL 和拦截器,可以避免在每个请求中重复编写相同的代码。

  2. 统一管理: 拦截器可以帮助你统一处理请求和响应,例如统一添加认证信息、统一处理错误等。

  3. 提高可维护性: 封装请求函数后,API 请求的逻辑集中在一个地方,便于维护和修改。

  4. 增强可读性: 通过合理的配置和封装,代码结构更加清晰,易于理解和阅读。

timeout: 设置请求的超时时间。如果请求在指定的时间内没有得到响应,Axios 会自动终止请求并抛出一个错误。这可以防止请求长时间挂起,影响用户体验

请求拦截器是“请求前”的逻辑,用于修改请求配置。(请求前要干的事)

响应拦截器是“请求后”的逻辑,用于处理响应数据或错误。(请求后要干的事)

1. 安装axios(实践开始)

npm i axios

2. 基础配置

官方文档地址:起步 | Axios Docs 基础配置通常包括:

  1. 实例化 - baseURL + timeout

  2. 拦截器 - 携带token 401拦截等

路径:@/utils/http.js

import axios from 'axios'

// 创建axios实例
const httpInstance = axios.create({
  baseURL: 'http://pcapi-xiaotuxian-front-devtest.itheima.net',
  timeout: 5000
})

// axios请求拦截器
httpInstance.interceptors.request.use(config => {
  return config
}, e => Promise.reject(e))

// axios响应拦截器
httpInstance.interceptors.response.use(res => res.data, e => {
  return Promise.reject(e)
})

export default httpInstance

3. 封装请求函数并测试

路径:@/apis/testAPI.js(新建)(为了测试axios 请求是否正常工作)

import httpInstance from "@/utils/http"

export function getCategory() {
  // 这里的getCategory方法,得和main.js中的方法名一致
  return httpInstance({
    // 完整的URL是 http://pcapi-xiaotuxian-front-devtest.itheima.net/home/category/head
    // 这里的url是相对路径,会自动拼接到baseURL后面
    url: 'home/category/head'
  })
}

再转到main.js,去调用接口函数(添加如下代码)

// 测试接口函数
import { getCategory } from '@/apis/testAPI'
getCategory().then(res => {
  console.log(res)
})

如果项目里面不同的业务模块需要的接口基地址不同,该如何来做?

axios.create() 方法可以执行多次,每次执行就会生成一个新的实例,比如:

const http1 = axios.create({ baseURL: 'url1'})
const http2 = axios.create({ baseURL: 'url2'})

测试完之后,没有问题,把测试接口函数删除。

git提交

路由整体设计

路由设计原则:找页面的切换方式,如果是整体切换,则为一级路由,如果是在一级路由的内部进行的内容切换,则为二级路由

本节创建俩一级路由,俩二级路由。下面是俩一级路由:(.vue文件,写如下代码)

<template>
  我是登录页
</template>
<template>
  我是首页
</template>

下面是俩二级路由:(.vue文件,写如下代码)

<template>
  我是home
</template>
<template>
  我是分类
</template>

创建新文件夹和新文件:(如果原本views文件夹里有初始化时的vue文件,删除)

@/views/Layout/index.vue

@/views/Login/index.vue

@/views/Home/index.vue

@/views/Category/index.vue

ESLint命名规则报错

在命名的时候,会遇到这种情况:Component name "index" should always be multi-word.这个错误是 Vue 的 ESLint 规则提示的,意思是:组件名(Component name)应该是多单词的。Vue 官方推荐组件名使用多个单词组合,而不是单个单词(如 index),以避免与现有的或未来的 HTML 元素冲突。

解决方案(1、修改组件名;2、禁用该规则(不推荐))(下面是第二种,这里我们采用第二种)

打开eslint.config.js配置文件,添加如下代码:

import js from '@eslint/js'
import pluginVue from 'eslint-plugin-vue'

module.exports = {
  rules: {
    // 不再强制要求组件命名
    // 'vue/multi-word-component-names': 'off'  // 亦可
    'vue/multi-word-component-names': 0
  }
}

配置路由

Vue Router 4.x 中:

  • <RouterView />(PascalCase)是官方推荐写法

  • <router-view />(kebab-case)兼容旧版但可能逐步弃用

@/router/index.js

// createRouter:创建router实例对象
// createWebHistory:创建history模式的路由

import { createRouter, createWebHistory } from 'vue-router'
import Login from '@/views/Login/index.vue'
import Layout from '@/views/Layout/index.vue'
import Home from '@/views/Home/index.vue'
import Category from '@/views/Category/index.vue'

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  // path和component对应关系的位置
  routes: [
    {
      path: '/',
      component: Layout,
      children: [
        {
          path: '',
          component: Home
        },
        {
          path: 'category',
          component: Category
        }
      ]
    },
    {
      path: '/login',
      component: Login
    }
  ]
})

export default router

git提交

静态资源引入和Error Lens安装

(so so so so easy)

资源说明

  1. 实际工作中的图片资源通常由 UI设计师 提供,常见的图片格式有png,svg等都是由UI切图交给前端

  2. 样式资源通常是指项目初始化的时候进行样式重置,常见的比如开源的 normalize.css 或者手写

1. 静态资源引入

  1. 图片资源 - 把 images 文件夹放到 assets 目录下(图片和样式资源均在“素材”里)

  2. 样式资源 - 把 common.scss 文件放到 styles 目录下

2. Error Lens插件安装

image.png

git提交

scss变量自动导入

为什么要设置“自动”导入呢?

PDF解释:在项目里一些组件共享的色值会以scss变量的方式统一放到一个名为 var.scss 的文件中,正常组件中使用,需要先导入scss文件,再使用内部的变量,比较繁琐,自动导入可以免去手动导入的步骤,直接使用内部的变量。

首先,要明白,什么是手动导入。手动导入是,比如说在App.vue中,要用到@/styles/var.scss中的样式,就需要在App.vue中导入该scss文件,import '@/styles/var.scss'但是,App.vue只是整个项目的一个组件,一个项目可能有几百个组件,总不能一个个组件,都要写import '@/styles/var.scss'吧?给你累死。

所以需要设置自动导入,设置完之后,组件里要用到var.scss,就不用再手动导入了(解放双手啦

新建文件:@/styles/var.scss

$xtxColor: #27ba9b; 
$helpColor: #e26237;
$sucColor: #1dc779;
$warnColor: #ffb302;
$priceColor: #cf4444;

修改vite.config.js文件:如下

css: {
    preprocessorOptions: {
      scss: {
        // 2. 自动导入定制化样式文件进行样式覆盖
        additionalData: `
          @use "@/styles/element/index.scss" as *;
          @use "@/styles/var.scss" as *;
        `,
      }
    }
}

在App.vue中,测试一下,看看var.scss的颜色能否生效。

<template>
  <!-- 一级路由出口组件 -->
   <RouterView />
   <div class="test">
    test scss(look at me now!!!)
   </div>
</template>

<style scoped lang="scss">
.test {
  color: $priceColor;
}

git提交

开发依赖-D 和 生产依赖(补充)

这里插个小知识:

npm install 命令中,-D--save-dev 的作用是将依赖安装为 开发依赖,而不加 -D 则是将依赖安装为 生产依赖。它们的区别主要体现在以下方面:


  1. 生产依赖(不加 -D

  • 用途:项目运行时必需的依赖。

  • 示例axiosvueelement-plus 等。

  • 安装命令:npm install axios

  • 保存位置:在 package.jsondependencies 字段中。

  • 场景:这些依赖会被打包到最终的生产环境中,用户访问项目时会用到。


  1. 开发依赖(加 -D

  • 用途:仅在开发阶段需要的依赖,例如构建工具、代码格式化工具、测试库等。

  • 示例sasseslintwebpackvite 等。

  • 安装命令:npm install sass -D

  • 保存位置:在 package.jsondevDependencies 字段中。

  • 场景:这些依赖不会被打包到生产环境中,仅在开发阶段使用。


  1. 为什么会有这种区分?

  • 减小生产环境体积:开发依赖不会被打包到生产环境中,可以减少最终项目的体积。

  • 明确依赖用途:通过区分生产依赖和开发依赖,可以更清晰地管理项目的依赖关系。

  • 优化安装速度:在生产环境中安装依赖时,可以通过 --production 参数只安装生产依赖,跳过开发依赖,加快安装速度。


  1. 如何选择是否加 -D

  • 如果依赖是项目运行所必需的(如 UI 库、HTTP 库),则不加 -D

  • 如果依赖仅用于开发阶段(如构建工具、测试工具),则加 -D

什么是开发依赖?生产依赖?

可以把项目想象成一家餐厅,依赖就是餐厅需要用到的东西:

1. 生产依赖(食材) 👉 ​顾客能直接感受到的东西​ 比如:蔬菜、肉类、调料 对应项目:Vue框架、Element UI组件、axios(发网络请求) 它们会直接“端上桌”,变成用户能看到的页面和功能。

2. 开发依赖(厨房工具) 👉 ​只有厨师需要用的东西​ 比如:菜刀、锅铲、烤箱 对应项目:ESLint(代码检查)、Webpack(打包工具)、测试工具 它们只在备菜(开发)时使用,成品菜里不会出现这些工具。

关键区别

  • 部署餐厅时:只需要带食材(生产依赖),不用带整个厨房(开发依赖)

  • 开发时:两者都需要,就像备菜既需要食材也需要工具

经典例子

  • npm install vue ➔ 生产依赖(用户必须加载的框架)

  • npm install eslint -D ➔ 开发依赖(只有你写代码时需要检查语法)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值