几年前,像许多其他人一样,我对 React.js 前端库的钩子和功能组件的到来感到“兴奋”。他们提供了一种全新的开发方式,编写的代码比使用 Components 类少得多。我真的被迷住了,并且迷上了很长一段时间。
今天我不得不选择 Vue.js 框架来满足一个全新的客户端项目的需求。在这个项目结束时,我对自己说,这是为您作为这个框架的新用户提供反馈的机会!
那么,这种技能的提升是否符合 Vue.js 的恶名?
如今,使用 Vue 开发前端比使用 React 更好吗?
这就是我们将要看到的!
谁说开始一个项目,就说寻找一个好的样板来节省我们数小时,甚至数天的辛苦配置!
不需要看得太远,npm create vue@latest 命令很大程度上满足了我的需求:
✔ Project name: … myproject-vue ✔ Add TypeScript? … No / Yes ✔ Add JSX Support? … No / Yes ✔ Add Vue Router for Single Page Application development? … No / Yes ✔ Add Pinia for state management? … No / Yes ✔ Add Vitest for Unit Testing? … No / Yes ✔ Add an End-to-End Testing Solution? › Playwright ✔ Add ESLint for code quality? … No / Yes ✔ Add Prettier for code formatting? … No / Yes ? Add Vue DevTools 7 extension for debugging? (experimental) › No / Yes
已经支持 Typescript 语言,提供路由系统和商店,甚至还有单元和端到端测试的空间!
默认情况下,Vite 捆绑程序已安装。这不是让我不高兴吗!?事实上,构建速度很快,而且大多数时候,热模块替换 (HMR) 效果很好。
一点 npm run dev 来启动本地开发服务器,然后!它已经在浏览器中运行了!
用于生产?只需输入 npm run build 命令,检查输入后,项目将作为静态文件导出到 dist 目录中(在已激活 Typescript 的情况下):
vite v5.2.11 building for production... ✓ 48 modules transformed. dist/index.html 0.43 kB │ gzip: 0.28 kB dist/assets/AboutView-C6Dx7pxG.css 0.09 kB │ gzip: 0.10 kB dist/assets/index-D6pr4OYR.css 4.21 kB │ gzip: 1.30 kB dist/assets/AboutView-CEwcYZ3g.js 0.22 kB │ gzip: 0.20 kB dist/assets/index-CfPjtpcd.js 89.23 kB │ gzip: 35.29 kB ✓ built in 591ms
. ├── README.md ├── e2e/ ├── index.html ├── package.json ├── public/ ├── src/ │ ├── App.vue │ ├── assets/ │ ├── components/ │ │ ├── HelloWorld.vue │ │ ├── TheWelcome.vue │ │ ├── WelcomeItem.vue │ │ ├── __tests__/ │ │ └── icons/ │ ├── main.ts │ ├── router/ │ │ └── index.ts │ ├── stores/ │ │ └── counter.ts │ └── views/ │ ├── AboutView.vue │ └── HomeView.vue ├── tsconfig.json └── vite.config.ts
在项目的建筑方面,我们特别发现:
✔ Project name: … myproject-vue ✔ Add TypeScript? … No / Yes ✔ Add JSX Support? … No / Yes ✔ Add Vue Router for Single Page Application development? … No / Yes ✔ Add Pinia for state management? … No / Yes ✔ Add Vitest for Unit Testing? … No / Yes ✔ Add an End-to-End Testing Solution? › Playwright ✔ Add ESLint for code quality? … No / Yes ✔ Add Prettier for code formatting? … No / Yes ? Add Vue DevTools 7 extension for debugging? (experimental) › No / Yes
简而言之,文件架构相当简单,并且与 React 相对相似,即使在样板文件中检查了很多选项。
到目前为止,React 还没有什么真正新鲜的东西。这时就会出现显着差异!
这是受官方网站启发的代码片段。它只是在单击时更改文本的颜色,并在适用的情况下显示短语“上面的文本是绿色的”,但它代表了 *.vue 文件的典型架构:
vite v5.2.11 building for production... ✓ 48 modules transformed. dist/index.html 0.43 kB │ gzip: 0.28 kB dist/assets/AboutView-C6Dx7pxG.css 0.09 kB │ gzip: 0.10 kB dist/assets/index-D6pr4OYR.css 4.21 kB │ gzip: 1.30 kB dist/assets/AboutView-CEwcYZ3g.js 0.22 kB │ gzip: 0.20 kB dist/assets/index-CfPjtpcd.js 89.23 kB │ gzip: 35.29 kB ✓ built in 591ms
注意事件与@click的绑定,条件显示与v-if,以及CSS中与v-bind()的绑定。
代码分为 3 个截然不同的部分:
这三个部分永远不会混合?.
这有几个优点,这是我在客户项目的经验中亲身体验到的:
使用
小缺点:先验没有自动 CSS 填充。因此,你应该瞄准像 vue-emotion 这样的书店。
从我的角度来看,我发现这种“all-in-JS”库有点破坏了 Vue 提供的架构,而且显然,浏览器特定的 CSS 属性在当今时代已经很少见了。 因此,de Vue 通常是自给自足的。
简而言之,我发现这种一体式架构非常令人愉快,但各个部分却清晰分开。这可以让您保持干净的代码,而且更加简洁。事实上,“业务逻辑/显示/样式”这三个部分的同时存在通常会鼓励您将代码重新划分为更小的模块,从而划分为更小的文件。
现在,如果我们仔细看看 Vue.js API 本身会怎样?
在这里,我不会向您提供我遇到的 Vue.js API 的所有元素的详尽列表,而是只提供一些我发现相当代表 Vue 逻辑的非常具体的元素。
让我们从 React 世界中众所周知的操作开始:在数据更新后智能地重新计算 HTML 渲染(或变量)。
有一个非常直观的compute()函数,它受益于记忆系统(一种“缓存”),以避免每次重新计算输出值:
✔ Project name: … myproject-vue ✔ Add TypeScript? … No / Yes ✔ Add JSX Support? … No / Yes ✔ Add Vue Router for Single Page Application development? … No / Yes ✔ Add Pinia for state management? … No / Yes ✔ Add Vitest for Unit Testing? … No / Yes ✔ Add an End-to-End Testing Solution? › Playwright ✔ Add ESLint for code quality? … No / Yes ✔ Add Prettier for code formatting? … No / Yes ? Add Vue DevTools 7 extension for debugging? (experimental) › No / Yes
这里仅当 PushBtn 的值发生变化时才计算 magicNumber。而且它是可验证的:消息“再次计算!”仅当单击不同的按钮时才显示在控制台中。
因此,与 React 不同,无需在该函数中显式指定要监视的变量。
同样,我们还发现了 watch 和 watchEffect ,它们分别允许你对组件的全部或部分属性的变化做出反应,就像 React 中的 useEffect 一样:
vite v5.2.11 building for production... ✓ 48 modules transformed. dist/index.html 0.43 kB │ gzip: 0.28 kB dist/assets/AboutView-C6Dx7pxG.css 0.09 kB │ gzip: 0.10 kB dist/assets/index-D6pr4OYR.css 4.21 kB │ gzip: 1.30 kB dist/assets/AboutView-CEwcYZ3g.js 0.22 kB │ gzip: 0.20 kB dist/assets/index-CfPjtpcd.js 89.23 kB │ gzip: 35.29 kB ✓ built in 591ms
只需点击数字修改按钮即可增加“手表”计数器。
然后,watch() 允许我们在每次某些变量发生变化时触发回调。
该功能的优势在于深入变量修改分析:Vue 甚至可以检测到子对象深处的变化!
从父组件声明属性并将其传递给子组件是一个相当重复的操作。也可以在子级和父级之间同步此值,例如在表单的输入中。
此外,不要像这样同时管理属性和基于事件的更新回调:
✔ Project name: … myproject-vue ✔ Add TypeScript? … No / Yes ✔ Add JSX Support? … No / Yes ✔ Add Vue Router for Single Page Application development? … No / Yes ✔ Add Pinia for state management? … No / Yes ✔ Add Vitest for Unit Testing? … No / Yes ✔ Add an End-to-End Testing Solution? › Playwright ✔ Add ESLint for code quality? … No / Yes ✔ Add Prettier for code formatting? … No / Yes ? Add Vue DevTools 7 extension for debugging? (experimental) › No / Yes
…可以使用 DefineModel 宏来代替,这样可以简化编写:
vite v5.2.11 building for production... ✓ 48 modules transformed. dist/index.html 0.43 kB │ gzip: 0.28 kB dist/assets/AboutView-C6Dx7pxG.css 0.09 kB │ gzip: 0.10 kB dist/assets/index-D6pr4OYR.css 4.21 kB │ gzip: 1.30 kB dist/assets/AboutView-CEwcYZ3g.js 0.22 kB │ gzip: 0.20 kB dist/assets/index-CfPjtpcd.js 89.23 kB │ gzip: 35.29 kB ✓ built in 591ms
短多了! ?再说了,模型只有一个,我连命名都可以省去!
和家长:
. ├── README.md ├── e2e/ ├── index.html ├── package.json ├── public/ ├── src/ │ ├── App.vue │ ├── assets/ │ ├── components/ │ │ ├── HelloWorld.vue │ │ ├── TheWelcome.vue │ │ ├── WelcomeItem.vue │ │ ├── __tests__/ │ │ └── icons/ │ ├── main.ts │ ├── router/ │ │ └── index.ts │ ├── stores/ │ │ └── counter.ts │ └── views/ │ ├── AboutView.vue │ └── HomeView.vue ├── tsconfig.json └── vite.config.ts
看到 v-model 后继续 v-for 让我意识到 Vue.js 开始通过隐式代码引入很多“魔法”:
import './assets/main.css'; import { createApp } from 'vue'; import { createPinia } from 'pinia'; import App from './App.vue'; import router from './router'; const app = createApp(App); // composant racine app.use(createPinia()); // store app.use(router); // routage des pages front app.mount('#app');
结果:
正如人们所期望的,v-for 指令因此可以为可迭代的每个元素自动重复 HTML 模式的一部分(此处为
在 React 方面,需要使用 JSX 自己构建每个元素,随着组件的增长,代码的可读性会降低:
<script setup> import { ref } from 'vue'; const color = ref('green'); function toggleColor() { color.value = color.value === 'green' ? 'blue' : 'green'; } </script> <template> <p class="main-text" @click="toggleColor"> Cliquez sur ce texte pour changer de couleur. </p> <p v-if="color === 'green'">Le texte ci-dessus est vert.</p> </template> <style scoped> .main-text { color: v-bind(color); } </style>
就我个人而言,从代码整洁度方面我更喜欢Vue的结构,只要不需要调试即可。 ?
顺便问一下,既然我们谈论的是调试,那么 Vue 生态系统工具呢?
这里有 3 个在我的项目开发过程中引起我注意的工具。
我从显而易见的开始,但是,是的,VSCode Vue(和其他 IDE)有一个扩展,它添加了语法突出显示、自动完成、片段等。必备!
但是,我注意到着色和自动完成方面存在一些不稳定,有时有点反复无常?,在这里我能够欣赏到 React 方面更大的稳定性。
与 React Developer Tools 浏览器插件一样,还有 Vue.js devtools 插件,我必须承认,它已经提供得很好:
有 4 个选项卡:
简而言之,对于调试,这里有您需要的一切,甚至更多!
几乎毫不奇怪(但仍然有优点!),还有一个用于 Vue 的 UI 库,它实现了 Google 的 Material Design,并且还提供了标准图标列表:Vuetify。
✔ Project name: … myproject-vue ✔ Add TypeScript? … No / Yes ✔ Add JSX Support? … No / Yes ✔ Add Vue Router for Single Page Application development? … No / Yes ✔ Add Pinia for state management? … No / Yes ✔ Add Vitest for Unit Testing? … No / Yes ✔ Add an End-to-End Testing Solution? › Playwright ✔ Add ESLint for code quality? … No / Yes ✔ Add Prettier for code formatting? … No / Yes ? Add Vue DevTools 7 extension for debugging? (experimental) › No / Yes
这可以在项目启动或不需要太多图形定制的项目上节省大量时间。
但一如既往,我建议密切关注这种高级库的渲染性能。库的配置容量往往是在其他地方付费的!
对于从 React 迁移到 Vue 的体验我们能说些什么?
首先,从代码的角度来看,与 React 相比,我想说 Vue 库是:
但是,由于其代码更多地用 JSX 编写,我发现 React 仍然比 Vue 更具互操作性、更具编程性和更明确,并且具有更好的 linter 稳定性。
在开发环境和社区方面,Vue 已经具备了确保高效开发到生产的所有优势。
那么 Vue 上的这种技能提升是否名副其实?我会说是的。我发现这个学习曲线很有效,如果有机会,我会继续与 Vue 一起发展。
最后,现在用 Vue 开发前端比用 React 更好吗?
从完全个人的角度来看,我认为不是。尽管 Vue 和 React 的应用场景略有不同,但我更喜欢依赖 React 可靠的类型系统和更灵活的代码。但也许 Vue 的下一个版本及其工具会改变我的想法?
你呢,你的反馈是什么?
以上是我尝试从 React.js 切换到 Vue.js的详细内容。更多信息请关注PHP中文网其他相关文章!