20230724----重返学习-vue3知乎日报项目实战

day-119-one-hundred-and-nineteen-20230724-vue3知乎日报项目实战

vue3项目实战-知乎日报

主要问题

  • pinia 和 vuex4 的区别

  • @vue/clivite的区别

    • @vue/cli脚手架的底层核心是webpack
    • vite脚手架
      • 开发环境:基于ESModule模块规范处理的
      • 生产环境:基于轻量级的 rollup 打包工具处理
    • 目前我做 Vue3/React的项目,都是基于 vite脚手架来处理的,主要原因:vite 处理的速度要比 webpack 快很多,而且 webpack支持的一些生态插件,目前 vite 大部分也都支持了(或者提供了相应的解决方案)!但是因为 vite 处理兼容比较麻烦,所以我只用于Vue3这样的项目,不再考虑IE低版本浏览器的兼容。
    • 开发环境下vite要比webpack方式快很多很多(大概10~100倍),主要因为:即便开发环境下,基于webpck处理,也需要对代码按照规则进行编译,把编译后的内容进行预览,项目如果比较大,冷启动需要的时间也会很久(扩展:如何加快webpack编译和打包的速度);但是vite就不会,因为开发环境下,它根本不会对代码进行编译,基于原生的ESModule规范,在项目预览的时候,实现模块之间的依赖导入(但是对于一些少量的插件,也需要编译,例如:less
    • 但是vite在生产环境下,也需要对代码进行打包编译,只不过不是用webpack,而是使用了更轻量级的rollup
      • 整体编译的速度会比webpack快一些「自己私下搜索几条rollup打包快的原因」
      • 但是rollup的生态是不如webpack完善的,对于一些特殊的打包诉求,可能rollup处理不了「常规的基本都支持」
  • Vue3 和 Vue2 的区别

    • 两三年前,尤雨溪在B站开Vue3发布会的时候,我全程跟着听过,再结合这两年的运用,大概总结了以下几点区别:
    • 从底层机制上来讲:
      • Vue3 重写了DOM-diff算法,只比较动态节点,跳过静态节点,大大提高了视图编译的速度。相比较于Vue2,性能提高了 1.3~2倍。–> 扩展:diff算法
      • 利用了webpack中的tree shaking 机制,只打包用到的模块-按需打包,降低了打包后文件体积。
      • 响应式操作原理,放弃了Vue2中的Object.defineProperty(),采用ES6新增的Proxy进行数据劫持,所以不兼容IE浏览器。–> 扩展:vue2响应式原理vue3响应式原理
        • 使用Proxy的好处:
          • 更加方便:不用区分数组和对象,都基于Proxy做处理即可。
          • 性能更高:无需迭代对象每一项分别做劫持,直接对整个对象做劫持即可。
          • 功能更强:除了传统的get/set劫持,还劫持deleteProperty/defineProperty/has/ownKeys等更多的劫持方式!
      • Vue3还具备了一些Vue2没有的新特性:
        • 支持<Teleport>传送门组件
        • 支持<Suspense>异步组件。–> 使用方法,与骨架屏懒加载的联系。
        • 更好地支持TypeScript
        • 基于Custom Renderer API(自定义渲染 API),可以更好地进行图形绘制,可兼容小程序之类的。
    • 从语法上来讲:
      • Vue3 几乎完全兼容Vue2的语法,只不过不再具备Vue这个类(每个组件也不再是Vue的子类组件中的this也不再是Vue的实例),把之前Vue.prototype上的属性方法,作为this私有的属性方法
      • 只不过Vue3也提供了几乎完全不同于Vue2的语法(推荐使用新语法)
        • 基于Compsition API(聚合式API)替代Options API(配置项式API),所有代码都写在setup函数(或者<script setup>脚本)中!
        • 全面采用函数式编程,需要实现什么样的效果,都是从vue中解构出一个个的函数,例如:ref/reactive/computed/watch/watchEffect/nextTick/defineProps/defineEmits…
        • 重新定义钩子函数:onBeforeMount/onMounted/onBeforeUpdate/onUpdated/onBeforeUnmount/onUnmounted…
        • 自定义指令内部的钩子函数也改为和周期函数相匹配的名字。
        • 基于app.xxx做全局的配置。
        • 而且jsx语法使用上也有一些区别
      • Vue3<template>视图支持多个根节点,因为其内部采用了React中的Fragment原理
    • 相对应的其生态中:例如:vuex4、vue-router4、pinia、UI组件库,也全部都采用函数式编程了!
    • 总之,我认为Vue3这套新的机制和语法,都非常的不错,更贴进于前端未来发展的趋势;所以,在不考虑IE兼容的情况下,我基本上都是基于Vue3去做项目的开发!

冷启动与热启动

  • 冷启动:第一次启动-之前内存中没有相应的服务,我们是重新启动服务的!
# @vue/cli
$ yarn serve #第一次启动时。
$ yarn build# vite
$ yarn dev #第一次启动时。
$ yarn build
  • 热启动:冷启动后,启动的服务会存储到内存中,下一次代码有更新需要实时预览的时候,直接从内存中调起服务;而且会对之前编译的内容进行缓存,当代码有更新,只对更新的部分进行重新编译,以此提高编译和预览的速度 --> 热更新;

    • 解决缓存不足的问题:
      1. 修改配置
      2. 懒加载。
      3. 不行上微前端,上不同框架不同项目。
  • 开发环境下要比 webpack 方式快很多很多-大概 10 到 100 倍,主要因为:即便开发环境下,基于 webpack 处理,也需要对代码按照规则进行编译,把编译后的内容进行预览,项目如果比较大,冷启动需要的时候也会很久(扩展:如何加快 webpack 编译和打包的速度)。但是 vite 就不会,因为开发环境下,它根本不会对代码进行编译,而是基于原生的 ESModule 规范,在项目预览的时候,实现模块之间的依赖导入(对于一些少量的插件,也需要编译,例如 less 及 vue 文件)。

  • 但是 vite 在生产环境下,也需要对代码进行打包编译,只不过不是用的 webpack,而是使用了更轻量级的 rollup。

    • 整体编译的速度会比 webpack 快一些。自己私下搜索几条 rollup 打包快的原因。
    • 但是 rollup 的生态是不如 webpack 完善的,对于一些特殊的打包诉求,可能 rollup 处理不了-常规的基本都支持。

起后台

  • node 原生

    node server.js
    
  • pm2

    // pm2 start 文件路径/文件名称.文件后缀 --name 服务名
    pm2 start ./server.js --name theServerName
    

从零开始构建

  • 从零开始,基于 Vue3 + Vite + Pinia + TS 构建一个项目
  1. 基于脚手架创建一个工程化的项目

    yarn create vite
    
    • 按照步骤选择需要安装的模块,以此来创建一个初始的项目;

    • 进入项目再跑一遍环境

      yarn;
      
    1. 安装项目需要的模块-把能想到的先安装了

      • 生产依赖

        • axios 用于 axaj 通信
        • blueimp-md5 用于 md5 进行摘要
        • dayjs 用于日期格式化的
        • lib-flexible 移动端适配
        • lodash 工具函数库
        • pinia 用于 vue 全局状态
        • pinia-plugin-persistedstate 用于 pinia 持久化的
        • vant 移动端的 UI 框架
        • vue 用于 vue 核心
        • vue-router 用于 vue 路由
      • 开发依赖

        • less 用于 less 语法预编译
        • postcss-pxtorem 用于
        • prettier 用于代码格式化的
        • terser 用于代码压缩的
        • unplugin-vue-components 用于 vant 这个 UI 框架的按需导入
        • vite 用于项目工程化
        • vite-plugin-imp 用于 vite 原生按需导入插件
    2. 脚手架的配置vite.config.js

      • 需要处理兼容(不是IE兼容),可以使用 @vitejs/plugin-legacy 控制需要兼容的浏览器 browerslist 列表,以及需要 polyfills !
      • 基础配置
        • base
        • plugins
          • vue/vueJsx
          • viteImp
          • legacy
        • resolve/alias
        • vscode 同步配置@符的识别
      • 服务配置server
        • 和webpack-dev-server的配置几乎一致
      • 打包配置 build
        • assetsInlineLimit
        • minify
        • terserOptions
      • css样式的处理 css
    3. .eslintrc.cjs.prettierrc.json 可以按照自己的风格去修改配置

    4. 响应式布局开发

      • <meta name="viewport" ...>
      • 导入 lib-flexible
        • 根据当前设备的宽度,除以10,设置html(根元素)字体大小「REM和PX的换算比例」
        • 设置了最大宽度540
      • 设置稿按照 375 处理「vant的设计稿就是这个尺寸」
        • 配置 pxtorem 插件:把我们在样式中写的px单位,自动转换为rem
        • 后期编写样式,都按照375设计稿测量,把测量的值,直接以px去编写即可
    5. 环境变量的处理

      • @vue/cli脚手架中
        • 我们基于 process.env.xxx 获取环境变量
          • process.env.NODE_ENV:development/production
        • 基于 cross-env 插件「或者直接改配置项」,来设置环境变量
      • 在 vite 脚手架中
        • 环境变量的获取,都是基于ES6中的import.meta.xxx处理的
          • BASE_URL
          • MODE
          • DEV/PROD/SSR
        • 设置环境变量: 根目录中设置/.env /.env.development /.env.production
          • 命名规则VITE_xxx
    6. 还可以配置 husky-用于git提交时的钩子回调

  2. 搭建项目文件的骨架

    1. 准备需要的静态资源
    2. 配置接口管理
      • vite.config.js 配置跨域
      • api/http.js 对axios的统一封装
      • api/index.js
    3. components放公共组件、views放普通组件
    4. 配置 pinia 的骨架
    5. 配置路由的骨架
  3. 开始逐组件进行开发,一定要注意抽离/封装

  4. 自测&内测

  5. 部署

    yarn build
    
    • 把打包的内容部署到服务器,并且不要忘记服务器端一般也要设置跨域代理「nginx反向」

初始项目目录

  • .eslintrc.cjs 语法检测的配置文件。
  • .gitignore 关于 git 忽略目录的配置文件。
  • .prettierrc.json 格式化的配置文件。
  • package.json 包管理文件。
  • vite.config.js 主要的 vite 配置,算是 vue 项目的总体配置。

使用.env 文件

import { defineConfig, loadEnv } from "vite";export default defineConfig(({ command, mode }) => {// 根据当前工作目录中的 `mode` 加载 .env 文件// 设置第三个参数为 '' 来加载所有环境变量,而不管是否有 `VITE_` 前缀。const env = loadEnv(mode, process.cwd(), "");return {// vite 配置define: {__APP_ENV__: JSON.stringify(env.APP_ENV),},};
});

搭建项目文件的骨架

  1. 准备需要的静态资源
    • 图片等
    • 样式初始化文件
    • 工具函数
    • less 全局变量
  2. 配置接口管理

逐组件进行开发

  • 开始逐组件进行开发,一定要注意抽离与封装

进阶参考

  1. taro - React 技术栈
  2. pm2 使用教程

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

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

相关文章

PHPWord 实现合并多个word文件

PHPWord 本来想着当调包侠呢&#xff0c;结果翻了一遍文档&#xff0c;没有这种操作支持&#xff0c;阿这&#x1f602; GPT 不出意外的一顿胡扯&#xff0c;给&#x1f468;‍&#x1f9b3;气的要中风啦 思路 word 也就是docx结尾的文件本质上就是xml字符串&#xff0c; …

为什么很多程序员不用switch,而是大量 的if......else if?

不会吧还有人用if else和switch case&#xff1f;三目运算符&#xff1f; 不会吧&#xff1f; 不会吧&#xff1f;大佬都是全都不用的&#xff01;以JAVA为例 条件判断语句的四种写法&#xff0c;茴字的四种写法大家不会不知道吧 1.正常人写法&#xff1a; private static …

Linux中断(tasklet,工作队列,内核线程的使用)

文章目录 前言一、tasklet二、工作队列三、内核线程总结 前言 本篇文章来讲解在Linux中tasklet,工作队列,内核线程的使用。 一、tasklet tasklet在内核里面其实就是下面这样的一个结构体&#xff1a; struct tasklet_struct {struct tasklet_struct *next;unsigned long st…

使用的华为云RDS数据库不小心把数据删了

目录 前言恢复qp文件帮助文档表级时间点恢复删除数据的时候要注意 前言 华为云查数据的时候前面是有个序号的&#xff0c;删除数据的时候不小心把序号看成id了&#xff0c;导致误删数据。 注&#xff1a;图片如果看不清楚可以点击放大观看&#xff01; 恢复qp文件 华为云每天…

2023最新软件测试面试题(带答案)

1. 请自我介绍一下(需简单清楚的表述自已的基本情况&#xff0c;在这过程中要展现出自信&#xff0c;对工作有激情&#xff0c;上进&#xff0c;好学) 面试官您好&#xff0c;我叫###&#xff0c;今年26岁&#xff0c;来自江西九江&#xff0c;就读专业是电子商务&#xff0c;毕…

机器学习之主成分分析(Principal Component Analysis)

1 主成分分析介绍 1.1 什么是主成分分析 主成分分析&#xff08;Principal Component Analysis&#xff09;简称PCA&#xff0c;是一个非监督学习的机器学习算法&#xff0c;主要用于数据的降维&#xff0c;对于高维数据&#xff0c;通过降维&#xff0c;可以发现更便于人类理…

CVPR2023新作:pix2pix3D

Title: 3D-Aware Conditional Image SynthesisAffiliation: Carnegie Mellon University (卡内基梅隆大学)Authors: Kangle Deng, Gengshan Yang, Deva Ramanan, Jun-Yan ZhuKeywords: Image Synthesis, 3D-aware, Neural Radiance Fields, Interactive Editing, Conditional G…

Qt+GDAL开发笔记(一):在windows系统mingw32编译GDAL库、搭建开发环境和基础Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/131931309 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

驱动开发 day3 (模块化驱动启动led,蜂鸣器,风扇,震动马达)

模块化驱动启动led,蜂鸣器,风扇,震动马达并加上Makefile 封装模块化驱动&#xff0c;可自由安装卸载驱动&#xff0c;便于驱动更新(附图) 1.安装模块驱动同时初始化各个设备并使能 2.该驱动会自动创建驱动节点. 3.通过c函数程序输入控制各个设备 4.卸载模块驱动 //编译驱动…

K8s卷存储详解(一)

K8s卷存储详解&#xff08;一&#xff09; K8s 存储K8s卷分类K8s目前支持的卷类型 临时卷类型EmptyDirCSI 临时卷通用临时卷 K8s 存储 什么是卷&#xff1f;为什么要用卷&#xff1f; 我们知道K8s是基于容器&#xff0c;对各个Pod进行管理的。Pod是由容器构成的&#xff0c;我…

开发中遇到的 cookie 问题

1. cookie 无法跨域携带问题 尽管已经登录&#xff0c;但是请求接口返回状态码&#xff1a;202&#xff0c;msg&#xff1a; 未登录&#xff0c;如下图所示&#xff1b; 1.1 XMLHttpRequest.withCredentials未设置 如果需要跨域 AJAX 请求发送 Cookie&#xff0c;需要withCre…

使用wxPython和pillow开发拼图小游戏(四)

上一篇介绍了使用本地图片来初始化游戏的方法&#xff0c;通过前边三篇&#xff0c;该小游戏的主要内容差不多介绍完了&#xff0c;最后这一篇来介绍下游戏用时的计算、重置游戏和关闭窗口事件处理 游戏用时的计算 对于游戏用时的记录&#xff0c;看过前几篇的小伙伴可能也发现…

MATLAB实现图像处理:图像识别、去雨、去雾、去噪、去模糊等等(附上20个完整仿真源码)

图像处理是计算机视觉领域的重要研究方向&#xff0c;MATLAB是一种功能强大的数学计算软件&#xff0c;可以用于图像处理和分析。下面是一些简单的MATLAB图像处理代码示例&#xff0c;包括图像增强、边缘检测、形态学处理、特征提取等。 文章目录 1. 图像增强2. 边缘检测3. 形态…

【雕爷学编程】Arduino动手做(88)---水流量传感器模块3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

Springboot初识(二)

文章目录 前言一.Spring配置文件1.1 配置文件的作用1.2 配置文件的类型 二.properties配置⽂件说明2.1 基本语法2.2 读取配置文件 三.yml 配置⽂件说明2.1 基本语法2.2 读取配置文件2.3 注意事项 前言 上篇文章我们介绍了什么是SpringBoot和怎么去创建一个SpringBoot项目,现在…

Navicat连接服务器上Docker安装的mysql提示拒绝连接

一、报错的原因 英语翻译 --- ‘不允许主机连接到此MySQL服务器’ &#xff08;意思是本地账号连接可以登录&#xff0c;但是远程登陆不行&#xff09; 二、解决方法 ①进入docker中的mysql容器 docker exec -it mysql bash ②登陆mysql mysql -uroot -p ③执行以下步骤…

13.5.3 【Linux】PAM 模块设置语法

PAM 借由一个与程序相同文件名的配置文件来进行一连串的认证分析需求。我们同样以passwd 这个指令的调用 PAM 来说明好了。 当你执行 passwd 后&#xff0c;这支程序调用 PAM 的流程是&#xff1a; 1. 使用者开始执行 /usr/bin/passwd 这支程序&#xff0c;并输入密码&#xf…

Mongodb 多文档聚合操作处理方法(Map-reduce 函数)

聚合 聚合操作处理多个文档并返回计算结果。您可以使用聚合操作来&#xff1a; 将多个文档中的值分组在一起。 对分组数据执行操作以返回单个结果。 分析数据随时间的变化。 要执行聚合操作&#xff0c;您可以使用&#xff1a; 聚合管道 单一目的聚合方法 Map-reduce 函…

基于Java+SpringBoot+vue前后端分离在线商城系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

spring 存储对象 + 获取对象

前言 本篇在spring中如何使用五大类注释与方法注释将对象加入IOC容器中&#xff0c;了解如何使用注释来获取容器中的Bean对象&#xff0c;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff01; 文章目录 前言1.通过注释将类加入IoC…