依赖管理的应用 ---vue项目的router优化

486 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情


route写法

最近团队调整,进入到了一个新团队,突然接手了很多老的vue项目,每个项目都会有很多的路由页面。当有修改页面的需求,我需要通过router.js或者router文件夹去找对应的view页面,非常的影响开发体验,经过梳理,发现项目的路由页面基本都是这2种写法

第一种:把所有route对象都放到一个数组里面

// router/index.js
import Vue from "vue";
import VueRouter from "vue-router";
Vue.use(VueRouter);
const routes = [
  {
    path: '/a',
    name: 'a',
    component: () => import('@/views/a/index'),
  },
  {
    path: '/b',
    name: 'b',
    component: () => import('@/views/b/index'),
  },
  {
    path: '/c',
    name: 'c',
    component: () => import('@/views/c/index'),
  },
]
const router = new VueRouter({
  routes, 
});
export default router;

这样的缺点是不够清晰,当页面过多的时候,找一个路由需要找半天,命名和格式也不易统一,在项目中使用webpack的魔法注释/* webpackChunkName:"lodash" */也容易出错。

第二种:把所有route对象拿出去,新建个js文件并导出,放到当前目录的文件夹下

// router/a.js
export default [
  {
    name: "a",
    path:"/a/a",
    component: () => import("@/views/a/a.vue"),
  },
]
// router/index.js
import Vue from "vue";
import VueRouter from "vue-router";
import a from "./a.js";
import b from "./b.js";
import c from "./c.js";

Vue.use(VueRouter);

const router = new VueRouter({
  routes: [...a,...b,...c], 
});
export default router;

这样的好处是每个模块清晰明了,比第一种好一些,一个模块下的所有路由都放到一个js文件中,但也存在问题,我们每次使用都需要手动import,并且还要在router里面浅拷贝了一次。

基于我们第二种方法优化

我们可以使用webpack提供的require.context() 函数来创建自己的 context,方法改造如下:

// router/index.js
import Vue from "vue";
import VueRouter from "vue-router";
Vue.use(VueRouter);

const modulesFiles = require.context("./", true, /\.js$/)
const routes = modulesFiles.keys().reduce((prev, path) => prev.concat(modulesFiles(path).default || []), [])
const router = new VueRouter({routes});
export default router;

由于本文件引入的时候是undefined,所以会忽略过滤index.js中的代码,当每次我们新创建的模块的时候,我们只需要放心的在router目录下新增route(xxx.js)就好,可以减少重复开发时间,代码也变得简洁很多。

举一反三

当我们引用项目的utilscomponentapimodel,都可以使用这个方法,当然可能需要稍微改造一下,这样可以减少重复代码与提高开发效率,同时也起到精简项目的作用。

关于require.context()函数

我们可以给这个函数传入三个参数:一个要搜索的目录,一个标记表示是否还搜索其子目录, 以及一个匹配文件的正则表达式。 Webpack 会在构建中解析代码中的 require.context() 。 语法如下:

require.context(
  directory,
  (useSubdirectories = true),
  (regExp = /^\.\/.*$/),
  (mode = 'sync')
);

示例:

require.context('./test', false, /\.test\.js$/);
//(创建出)一个 context,其中文件来自 test 目录,request 以 `.test.js` 结尾。
require.context('../', true, /\.stories\.js$/)
// (创建出)一个 context,其中所有文件都来自父文件夹及其所有子级文件夹,request 以 `.stories.js` 结尾。

关于webpack的requirecontext官方文档:webpack.docschina.org/guides/depe…