18 个月内完成 3 个 Vue 项目后的体验

2025-05-24

18 个月内完成 3 个 Vue 项目后的体验

18 个月内完成 3 个 Vue 项目后的体验

你好,开发者朋友!很高兴在这里见到你。

在这篇文章中,我将分享过去 18 个月使用 Vue 2.* 编写/维护 3 个项目的经验。

显示主题

需要重点关注的主题是:

  1. Agile Methodology and frameworks used
  2. Design Systems
  3. Infrastructure
  4. Backend
  5. State Management
  6. Frontend

免责声明:这篇文章来自我这段时间的亲身经历,并不是说这是最好的方法,也不是最糟糕的方法,欢迎在下面的帖子中提出任何贡献!

使用的敏捷方法和框架

您熟悉敏捷软件开发吗?因为我现在确实熟悉!我非常喜欢用这句简单的话来总结:

敏捷是创造和响应变化的能力。它是一种应对不确定和动荡环境并最终取得成功的方法。

很棒,简单,直截了当,不是吗?在过去的一年半中,我的团队传递了 3 种不同的框架:

  • Scrum:从我的角度来看,最有趣的是,这个框架允许我们跨职能团队作为一个整体进行互动,将工作分解为 2 周的冲刺,并不断调整业务需求,这是一个相当不错的体验!强烈推荐。

  • Kanban:从上到下,这是我第二喜欢的,当要做的工作不遵循相同的路径时,这是一个很好的选择,例如同时在不同的 repos 上工作(MonoRepos、MFE、Legacy Systems);当这种情况发生时,也许Scrum不足以满足时间框架的要求。

  • 极限编程 (XP):根据我的经验,我的一个团队的 MVP 所必需的,这是最危险的,因为你会动态地改变需求,一些繁重的工作可能会在以后神奇地出现/消失,强烈不推荐,除非它是“极端”必要的(双关语),请“极其”谨慎(双关语 X2)。

如果您想了解Agile Manifesto(方法论的基石),您可以在这里阅读。

设计系统

我了解到,在定义方法论之后,最好有一个强大的方法论Design System,您有两个选择:重用现有的方法论或从头开始创建一个自定义方法论,无论哪种方式,好处都是惊人的!当它出现时,它涵盖了 3 个不同的领域:

  1. UI/UX不会重复
  2. WebDev只有一个事实来源
  3. QA可以自行提出问题

如果您想要一些现有的指导方针,您可以在这里找到野外可用资源的列表。

在我工作的团队中,成功的秘诀是:

我们发现一个很好的策略是使用并创建其各自的故事来创建Vue组件;我可以说这是一个很棒的方法,因为你可以定义你自己的故事,并将其发布到所有团队成员都可以访问的页面上(在 VPN 下更安全),因此每个人都可以使用它,他们甚至可以在实施之前就看到组件在隔离范围内运行!TailwindStorybookDesign SystemStorybook

基础设施

哦,对了,我们有了方法论设计系统,然后呢?

我了解到Infrastructure,我们有机会使用的方法是JenkinsTravisCIGitHub Actions

对于大型项目的经验来说,Jenkins这是一个很好的方法,在所有优点中,您可以在部署之前设置它来代表您运行单元测试端到端测试!如果发生故障,您会收到通知并且可以包含修复。

在小型项目或副项目中,您可以使用TravisCI + GitHub Actions方法;GitHub已经有一些内置选项可用于设置ymls并帮助您合并请求部署

注意TravisCI在您注册时免费为您提供 10,000 个构建,对于小型项目、概念验证或辅助项目来说,这是一个很划算的交易!

后端

我还从这些项目中了解到,BackendNodeJSFirebase很容易处理。

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
Enter fullscreen mode Exit fullscreen mode

引用中的模块index.js使它们可以在整个项目中导入,这包括、、、State模块只是在中添加一个新条目,弃用的模块是删除该条目(可能适用条件)。GettersMutationsActionsindex.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']),
  },
};
Enter fullscreen mode Exit fullscreen mode

无论您的项目有多小或多大,它都将准备好扩展,您可以在这里阅读有关Vuex命名空间的更多信息。

前端

我了解到,它Vue的学习曲线比要小Angular,而且与非常相似React注意:假设您具有扎实的 Javascript 基础,否则它们的学习曲线都很高)。

作为一名主要参与Angular项目的开发人员,理解核心概念并开始高效工作比想象的要容易;我真的认为反过来肯定更难,因为项目Angular有自己的世界。

还了解了一些使我的开发更快、更容易的核心概念:

  • 原子设计模式:将您的文件夹构造为 =>
    • 原子:这些是基本组件,虚拟组件;可以是按钮、输入、下拉菜单,任何可以想象的足够小的组件,可以运行和测试
    • 分子:一组原子,在这个层面上只包含一点逻辑,它不应该包括与你的状态的交流(如果可能的话)
    • 生物体:混合物!可以有原子分子,在这一层可以允许与你的国家进行沟通;这里接受映射器、获取器
    • 模板:在这里您将上述结构添加在一起
    • 页面:您添加的每个页面都是一个可以从路由策略访问的实例
Enter fullscreen mode Exit fullscreen mode
  • 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);
Enter fullscreen mode Exit fullscreen mode
Enter fullscreen mode Exit fullscreen mode
  • Vue Test UtilsVue有自己的用于测试目的的实用程序,并且非常容易理解和使用,让我展示一下我发现的最简单的示例:
<template>
  <div class="modal" data-test="modal" aria-modal="true">
    <div class="modal-content">
      <slot></slot>
    </div>
  </div>
</template>
Enter fullscreen mode Exit fullscreen mode
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);
      });
    });
  });
});
Enter fullscreen mode Exit fullscreen mode
Enter fullscreen mode Exit fullscreen mode
  • 组件的全局注册:有些组件使用非常广泛,因此需要进行全局注册,以便无需导入即可引用它们。一个简单的方法是创建一个_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);
});
Enter fullscreen mode Exit fullscreen mode

之后,只需在main.js文件中导入该文件:

import '@/components/_globals';
Enter fullscreen mode Exit fullscreen mode

还可以找到一些其他的好做法:

结论

如上所示,在过去的 18 个月中我取得了长足的进步,我在这里就我理解的概念以及我认为应用的最佳实践发表我的看法;也许你可以有更好的方法,让我们在下面的帖子中讨论!

感谢阅读!

文章来源:https://dev.to/crisarji/my-vue-experience-after-3-projects-in-18-months-456c
PREV
在 5 分钟内使用 cPanel 部署/托管您的 React 应用程序 深入了解 FileZilla 上的注释
NEXT
在学习 Flutter 之前先学习 Dart