18 个月内完成 3 个 Vue 项目后的体验
18 个月内完成 3 个 Vue 项目后的体验
你好,开发者朋友!很高兴在这里见到你。
在这篇文章中,我将分享过去 18 个月使用 Vue 2.* 编写/维护 3 个项目的经验。
显示主题
需要重点关注的主题是:
Agile Methodology and frameworks used
Design Systems
Infrastructure
Backend
State Management
Frontend
免责声明:这篇文章来自我这段时间的亲身经历,并不是说这是最好的方法,也不是最糟糕的方法,欢迎在下面的帖子中提出任何贡献!
使用的敏捷方法和框架
您熟悉敏捷软件开发吗?因为我现在确实熟悉!我非常喜欢用这句简单的话来总结:
敏捷是创造和响应变化的能力。它是一种应对不确定和动荡环境并最终取得成功的方法。
- 来源:什么是敏捷?
很棒,简单,直截了当,不是吗?在过去的一年半中,我的团队传递了 3 种不同的框架:
-
Scrum:从我的角度来看,最有趣的是,这个框架允许我们跨职能团队作为一个整体进行互动,将工作分解为 2 周的冲刺,并不断调整业务需求,这是一个相当不错的体验!强烈推荐。
-
Kanban:从上到下,这是我第二喜欢的,当要做的工作不遵循相同的路径时,这是一个很好的选择,例如同时在不同的 repos 上工作(MonoRepos、MFE、Legacy Systems);当这种情况发生时,也许Scrum不足以满足时间框架的要求。
-
极限编程 (XP):根据我的经验,我的一个团队的 MVP 所必需的,这是最危险的,因为你会动态地改变需求,一些繁重的工作可能会在以后神奇地出现/消失,强烈不推荐,除非它是“极端”必要的(双关语),请“极其”谨慎(双关语 X2)。
如果您想了解Agile Manifesto
(方法论的基石),您可以在这里阅读。
设计系统
我了解到,在定义方法论之后,最好有一个强大的方法论Design System
,您有两个选择:重用现有的方法论或从头开始创建一个自定义方法论,无论哪种方式,好处都是惊人的!当它出现时,它涵盖了 3 个不同的领域:
UI/UX
不会重复WebDev
只有一个事实来源QA
可以自行提出问题
如果您想要一些现有的指导方针,您可以在这里找到野外可用资源的列表。
在我工作的团队中,成功的秘诀是:
我们发现一个很好的策略是使用并创建其各自的故事来创建Vue
组件;我可以说这是一个很棒的方法,因为你可以定义你自己的故事,并将其发布到所有团队成员都可以访问的页面上(在 VPN 下更安全),因此每个人都可以使用它,他们甚至可以在实施之前就看到组件在隔离范围内运行!Tailwind
Storybook
Design System
Storybook
基础设施
我了解到Infrastructure
,我们有机会使用的方法是Jenkins、TravisCI和GitHub Actions。
对于大型项目的经验来说,Jenkins
这是一个很好的方法,在所有优点中,您可以在部署之前设置它来代表您运行单元测试和端到端测试!如果发生故障,您会收到通知并且可以包含修复。
在小型项目或副项目中,您可以使用TravisCI + GitHub Actions方法;GitHub
已经有一些内置选项可用于设置ymls
并帮助您合并请求和部署。
注意:TravisCI在您注册时免费为您提供 10,000 个构建,对于小型项目、概念验证或辅助项目来说,这是一个很划算的交易!
后端
我还从这些项目中了解到,Backend
NodeJS和Firebase很容易处理。
NodeJS + Express让您有机会处理CRUD操作的路由,可以轻松处理请求/响应。
只要您将Firebase导入到您的Vue项目中,它就可以立即使用;只需几行代码,您就可以做很多事情!;身份验证、存储、实时数据库,一大堆选项可供您使用。
如果您想查看,我写了与某些 Firebase 功能相关的非规范系列文章。
状态管理
我学习了VueJS + Vuex。我习惯使用 Rxjs 和 NgRx,但根据我的经验,Vuex 是最简单的;只需掌握一点知识,你就可以开始自己创建,通过模块分离关注点,并且引用的方式非常清晰:
store/
├── index.js
└── modules/
├── module1.store.js
├── module2.store.js
├── module3.store.js
├── module4.store.js
└── module5.store.js
引用中的模块index.js
使它们可以在整个项目中导入,这包括、、、State
;新模块只是在中添加一个新条目,弃用的模块是删除该条目(可能适用条件)。Getters
Mutations
Actions
index.js
我还了解到您可以使用namespace
模块!然后您可以通过模块区分元素,而不是使用几十行没有上下文的代码(相信我,对于多个模块来说,这对于调试目的、可扩展性和视觉效果来说非常棒)。
下面是一个清晰的例子:
import { mapState, mapGetters, mapActions, mapMutations } from 'vuex';
export default {
computed: {
// Accessing root properties
...mapState('my_module', ['property']),
// Accessing getters
...mapGetters('my_module', ['property']),
// Accessing non-root properties
...mapState('my_module', {
property: state => state.object.nested.property,
}),
},
methods: {
// Accessing actions
...mapActions('my_module', ['myAction']),
// Accessing mutations
...mapMutations('my_module', ['myMutation']),
},
};
无论您的项目有多小或多大,它都将准备好扩展,您可以在这里阅读有关Vuex和命名空间的更多信息。
前端
我了解到,它Vue
的学习曲线比要小Angular
,而且与非常相似React
(注意:假设您具有扎实的 Javascript 基础,否则它们的学习曲线都很高)。
作为一名主要参与Angular
项目的开发人员,理解核心概念并开始高效工作比想象的要容易;我真的认为反过来肯定更难,因为项目Angular
有自己的世界。
还了解了一些使我的开发更快、更容易的核心概念:
- 原子设计模式:将您的文件夹构造为 =>
- 原子:这些是基本组件,虚拟组件;可以是按钮、输入、下拉菜单,任何可以想象的足够小的组件,可以运行和测试
- 分子:一组原子,在这个层面上只包含一点逻辑,它不应该包括与你的状态的交流(如果可能的话)
- 生物体:混合物!可以有原子和分子,在这一层可以允许与你的国家进行沟通;这里接受映射器、获取器
- 模板:在这里您将上述结构添加在一起
- 页面:您添加的每个页面都是一个可以从路由策略访问的实例
- Vue 延迟路由:延迟加载路由组件非常简单;在 5 行代码中定义routerOptions后,它就设置好了。
import Vue from 'vue';
import Router from 'vue-router';
const routerOptions = [
{ path: '/', component: 'Home' },
{ path: '/home', component: 'Home' },
{ path: '/auth', component: 'Auth' },
{ path: '*', component: 'Auth' },
];
const routes = routerOptions.map(route => {
return {
...route,
component: () => import(/* webpackChunkName: "{{route.component}}" */ `../views/${route.component}.vue`),
};
});
Vue.use(Router);
- Vue Test Utils:
Vue
有自己的用于测试目的的实用程序,并且非常容易理解和使用,让我展示一下我发现的最简单的示例:
<template>
<div class="modal" data-test="modal" aria-modal="true">
<div class="modal-content">
<slot></slot>
</div>
</div>
</template>
import { expect } from 'chai';
import { shallowMount } from '@vue/test-utils';
import BaseModal from '@/components/atoms/BaseModal.vue';
describe('BaseModal', () => {
context('Template', () => {
context('existence of the element', () => {
it("should exist 'modal' element", () => {
const wrapper = shallowMount(BaseModal);
expect(wrapper.find("[data-test='modal']").exists()).to.equal(true);
});
});
});
});
- 组件的全局注册:有些组件使用非常广泛,因此需要进行全局注册,以便无需导入即可引用它们。一个简单的方法是创建一个
_globals.js
文件,并在其中填写以下内容:
// Globally register all base components for convenience, because they
// will be used very frequently. Components are registered using the
// PascalCased version of their file name.
import Vue from 'vue';
// https://webpack.js.org/guides/dependency-management/#require-context
const requireComponent = require.context(
// Look for files in the current directory
'./atoms',
// Do not look in subdirectories
false,
// Only include .vue files
/[\w-]+\.vue$/,
);
// For each matching file name...
requireComponent.keys().forEach(fileName => {
// Get the component config
const componentConfig = requireComponent(fileName);
// Get the PascalCase version of the component name
const componentName = fileName
// Remove the "./" from the beginning
.replace(/^\.\//, '')
// Remove the file extension from the end
.replace(/\.\w+$/, '');
Vue.component(componentName, componentConfig.default || componentConfig);
});
之后,只需在main.js文件中导入该文件:
import '@/components/_globals';
还可以找到一些其他的好做法:
结论
如上所示,在过去的 18 个月中我取得了长足的进步,我在这里就我理解的概念以及我认为应用的最佳实践发表我的看法;也许你可以有更好的方法,让我们在下面的帖子中讨论!
感谢阅读!
文章来源:https://dev.to/crisarji/my-vue-experience-after-3-projects-in-18-months-456c