uni-simple-router

🚀 优质资源分享 🚀

学习路线指引(点击解锁)知识定位人群定位

进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。

入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

  • 专为uniapp打造的路由器,和uniapp深度集成
  • 通配小程序、App和H5端
  • H5能完全使用vue-router开发
  • 模块化、查询、通配符、路由参数
  • 使 uni-app实现嵌套路由(仅H5端完全使用vue-router)
  • uniapp用到了很多vue的api,但在路由管理的功能相对于vue-router还是比较欠缺的,比如全局导航守卫
// 针对uniapp HBuilder创建的项目,非cli构建
// 1⃣ NPM 安装
npm install uni-simple-router

// 2⃣ 初始化
npm install uni-read-pages // 配合vue.config.js自动读取pages.json作为路由表的方式,源码例如下:扩二

// 配置vue.config.js
const TransformPages = require('uni-read-pages')
const tfPages = new TransformPages()
module.exports = {
    configureWebpack: {
        plugins: [
              new tfPages.webpack.DefinePlugin({
                      // 1⃣ 配置全局变量
                      // ROUTES: JSON.stringify(tfPages.routes)
                      // 2⃣ includes 可自定义,解析pages.json路由配字段的配置, 默认 ['path', 'name', 'aliasPath']
                        ROUTES: tfPages.webpack.DefinePlugin.runtimeValue(()=>{
                          const tf = new TransformPages({
                            includes:  ['path', 'name', 'aliasPath']
                          })
                          return JSON.stringify(tfPages.routes)
                        },true)
                  })
        ]
    }
}

// /Applications/HBuilderX.app/Contents/HBuilderX/plugins/uniapp-cli/node\_modules/webpack 我的webpack包路径,在软件contents包文件里软件自带的webpack

  • 允许创建一个 在编译时可以配置的全局变量
  • 场景:区分不同开发模式处理
// 1⃣ 用法:每个传进DefinePlugin的键值都是一个标志或者多个用.连接起来的标识符
new webpack.DefinePlugin({
  PRODUCTION: JSON.stringify(true),
  BROWSER\_SUPPRTS\_HTML5: true,
  VERSION: JSON.stringify('abcde'),
  TWO: '1+1',
  'typeof window': JSON.stringify('object')
})
// 使用方式
console.log('Running App version', VERSION)
if(!BROWSER\_SUPPRTS\_HTML5) require("html5shiv")

// 2⃣ 功能标记 来作为一个flag标识启用和禁用构建中的功能
new webpack.DefinePlugin({
  'SHOW\_PRESSION': JOSN.string(true)
})

// 3⃣ 服务:可以配置不同环境下的url
new webpack.DefinePlugin({
  'DEV\_URL': JSON.stringify(url_dev),
  'PRO\_URL': JSON.stringify(url_pro)
})

// 依赖的源码 - 通过node的path模块获取pages.json文件中的任何信息 (部分是个人注释)
const path = require('path')
const CONFIG = { includes: ['path', 'aliasPath', 'name'] } // 默认获取路由参数属性
// process.cwd() 返回Node.js进程的当前工作目录
// path.resolve(url1, 'abc') => url1/abc
const rootPath = path.resolve(process.cwd(), 'node\_modules'); // 获取根路径

/** 解析绝对路径
 * @param {Object} dir
 */
function resolvePath(dir) {
    return path.resolve(rootPath, dir);
}
// 类
class TransformPages {
    constructor(config) {
    // 组合 自定义获取配置属性
        config = { ...CONFIG, ...config };
        this.CONFIG = config;

    // ↓本机文件路径(HBuilderX包文件里自带的webpack模块路径) /Applications/HBuilderX.app/Contents/HBuilderX/plugins/uniapp-cli/node\_modules/webpack
        this.webpack = require(resolvePath('webpack'));
        this.uniPagesJSON = require(resolvePath('@dcloudio/uni-cli-shared/lib/pages.js'));

    // TODO: 根据CONFIG解析pages.json中的路由信息 和 小程序 分包下的路由
        this.routes = this.getPagesRoutes().concat(this.getNotMpRoutes());
    }
   // 获取所有pages.json下的内容 返回json
    get pagesJson() {
        return this.uniPagesJSON.getPagesJson();
    }

  // 通过读取pages.json文件 生成直接可用的routes
    getPagesRoutes(pages = this.pagesJson.pages, rootPath = null) {
        const routes = [];
        for (let i = 0; i < pages.length; i++) {
            const item = pages[i];
            const route = {};
            for (let j = 0; j < this.CONFIG.includes.length; j++) {
                const key = this.CONFIG.includes[j];
                let value = item[key];
                if (key === 'path') {
                    value = rootPath ? /${rootPath}/${value} : /${value}
                }
                if (key === 'aliasPath' && i == 0 && rootPath == null) {
                    route[key] = route[key] || '/'
                } else if (value !== undefined) {
                    route[key] = value;
                }
            }
            routes.push(route);
        }
        return routes;
    }

    // &#x89E3;&#x6790;&#x5C0F;&#x7A0B;&#x5E8F;&#x5206;&#x5305;&#x8DEF;&#x5F84;
    getNotMpRoutes() {
        const { subPackages } = this.pagesJson;
        let routes = [];
        if (subPackages == null || subPackages.length == 0) {
            return [];
        }
        for (let i = 0; i < subPackages.length; i++) {
            const subPages = subPackages[i].pages;
            const root = subPackages[i].root;
            const subRoutes = this.getPagesRoutes(subPages, root);
            routes = routes.concat(subRoutes)
        }
        return routes
    }
    /**
 * &#x5355;&#x6761;page&#x5BF9;&#x8C61;&#x89E3;&#x6790;
 * @param {Object} pageCallback
 * @param {Object} subPageCallback
 */
    parsePages(pageCallback, subPageCallback) {
        this.uniPagesJSON.parsePages(this.pagesJson, pageCallback, subPageCallback)
    }
}
module.exports = TransformPages

import {RouterMount,createRouter} from 'uni-simple-router';
const router = createRouter({
  // &#x8DEF;&#x7531;&#x914D;&#x7F6E;
  routes: [
    {
      path: '/pages/index/index', // &#x5FC5;&#x987B;&#x548C;pages.json&#x4E2D;&#x76F8;&#x540C;
      extra: {
        pageStyle: { color: '#f00' }// &#x53CA;&#x5176;&#x5B83;&#x81EA;&#x5B9A;&#x4E49;&#x53C2;&#x6570;
      }
    }
  ]
})
// &#x7EC4;&#x4EF6;&#x4E2D;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; this.$Route &#x67E5;&#x770B;&#x8DEF;&#x7531;&#x5143;&#x4FE1;&#x606F;

  • 嵌套路由时,若使用name方式跳转,仅支持 this.$router.push({ name: children1 })
// &#x4F7F;&#x7528; vue-router&#x5F00;&#x53D1;&#x5C06;&#x4F1A;&#x5931;&#x53BB;uniapp&#x7684;&#x751F;&#x547D;&#x5468;&#x671F;
const router = createRouter({
  h5: {
    vueRouterDev: true, // &#x5B8C;&#x5168;&#x4F7F;&#x7528;vue-router&#x5F00;&#x53D1; &#x9ED8;&#x8BA4;&#x662F;false
  },
  // &#x8DEF;&#x7531;&#x914D;&#x7F6E;
  routes: [
    {
      path: '/',
        name: 'home',
      component: () => import('@/common/router/home.vue'),
      // &#x5D4C;&#x5957;&#x8DEF;&#x7531;&#xFF08;&#x4EC5;H5&#x7AEF;&#xFF09;&#xFF0C;&#x5C0F;&#x7A0B;&#x5E8F;&#x7AEF;&#x4F1A;&#x91CD;&#x65B0;&#x9875;&#x9762;&#x6253;&#x5F00;
      children: [
        {
          path: 'home/children1',
          name: 'children1',
          component: () => import('@/common/router/children1.vue')
        },
        {
          path: 'home/children2',
          name: 'children2',
          component: () => import('@/common/router/children2.vue')
        }
      ]
    }
  ]
})

// &#x9664;vue-router&#x5916;&#xFF0C;&#x7F8E;&#x5316;url&#x53EF;&#x4EE5;&#x5728;&#x57FA;&#x7840;&#x914D;&#x7F6E;&#x65F6;&#xFF0C;&#x5B9A;&#x4E49;aliasPath&#x53D8;&#x91CF;&#xFF0C;&#x8BBE;&#x7F6E;&#x8DEF;&#x7531;&#x522B;&#x540D;&#xFF08;&#x6D4F;&#x89C8;&#x5668;&#x5730;&#x5740;&#x680F;&#x5C55;&#x793A;&#x540D;&#x79F0;&#xFF09;
// &#x522B;&#x540D;&#x7684;&#x8BBE;&#x7F6E;&#xFF0C;&#x5982;&#x679C;&#x8BBE;&#x7F6E;&#x4E86;&#x522B;&#x540D;&#xFF0C;&#x901A;&#x8FC7;push&#x8DEF;&#x5F84;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x5FC5;&#x987B;&#x4F7F;&#x7528;aliasPath&#x7684;&#x8DEF;&#x5F84;&#x624D;&#x80FD;&#x751F;&#x6548;
const router = createRouter({
  routes:[{
        name:'router1',
        //&#x4E3A;&#x4E86;&#x517C;&#x5BB9;&#x5176;&#x4ED6;&#x7AEF;&#xFF0C;&#x6B64;&#x65F6;&#x7684;path&#x4E0D;&#x80FD;&#x5C11;&#xFF0C;&#x5FC5;&#x987B;&#x548C; pages.json&#x4E2D;&#x7684;&#x9875;&#x9762;&#x8DEF;&#x5F84;&#x5339;&#x914D;
        path: "/pages/tabbar/tabbar-1/tabbar-1",
        aliasPath: '/tabbar-1',
    },]
});

// uni-simple-router&#x8DEF;&#x7531;&#x8DF3;&#x8F6C;
// aliasPath&#x547D;&#x540D;&#x7684;&#x8DEF;&#x7531; => name&#x4F20;&#x9012;&#x53C2;&#x6570;&#x9700; params
this.$Router.push({ name: 'detail', params: { id: 1 } })
// &#x5E26;&#x67E5;&#x8BE2;&#x53C2;&#x6570;&#xFF0C;&#x53D8;&#x6210; /home/id=1 => path &#x5BF9;&#x5E94;query&#xFF0C;params&#x5931;&#x6548;
this.$Router.push({ path: '/pages/index/detail', query: { id: 1 }})

path&#xFF1A;'*' // &#x901A;&#x5E38;&#x7528;&#x4E8E;&#x5BA2;&#x6237;&#x7AEF;404&#x9519;&#x8BEF;&#xFF0C;&#x5982;&#x679C;&#x662F;history&#x6A21;&#x5F0F;&#xFF0C;&#x9700;&#x8981;&#x6B63;&#x786E;&#x914D;&#x7F6E;&#x670D;&#x52A1;&#x5668;
path: '/detail-*'
// &#x8DEF;&#x7531;&#x7684;&#x4F18;&#x5148;&#x7EA7;&#x6839;&#x636E; &#x5B9A;&#x4E49;&#x7684;&#x5148;&#x540E;

  • 打包构建应用时,Javascript包会变得非常大,影响页面加载,把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件。
    *
const Foo = () => import('./Foo.vue')
// &#x628A;&#x7EC4;&#x4EF6;&#x6309;&#x7EC4;&#x5206;&#x5757; &#x4F7F;&#x7528; &#x547D;&#x540D; chunk
const Foo = () => import(/*webpackChunkName:"group-foo"*/ './Foo.vue')
const Bar = () => import(/*webpackChunkName:"group-foo"*/ './Bar.vue')


##### &#x4E09;&#x3001;&#x5C0F;&#x7A0B;&#x5E8F;&#x6A21;&#x5F0F;

* &#x6CE8;&#xFF1A;&#x5C0F;&#x7A0B;&#x5E8F;&#x7CFB;&#x5217;&#x65E0;&#x6CD5;&#x62E6;&#x622A;&#x539F;&#x751F;tabbar&#x53CA;&#x539F;&#x751F;&#x5BFC;&#x822A;&#x8FD4;&#x56DE;&#xFF0C;&#x5982;&#x9700;&#x62E6;&#x622A;&#x4F7F;&#x7528;&#x81EA;&#x5B9A;&#x4E49;tabbar&#x3001;header
* &#x901A;&#x8FC7;api&#x8FDB;&#x884C;&#x5207;&#x6362;&#x65F6;&#xFF0C;&#x50CF;uni.switchTab()&#x548C;this.$Router.pushTab()&#x65B9;&#x6CD5;&#x4F1A;&#x89E6;&#x53D1;&#x62E6;&#x622A;&#x7684;&#xFF1B;&#x4EC5;&#x5E95;&#x90E8;&#x539F;&#x751F;tabbar&#x8FDB;&#x884C;&#x5207;&#x6362;&#x65F6;&#x4E0D;&#x89E6;&#x53D1;&#x62E6;&#x622A;
* &#x5F3A;&#x5236;&#x89E6;&#x53D1;&#x5B88;&#x536B;&#xFF1A;forceGuardEach(replaceAll, false) &#x6BCF;&#x6B21;&#x8C03;&#x7528;api&#x90FD;&#x4F1A;&#x91CD;&#x65B0;&#x6309;&#x6D41;&#x7A0B;&#x89E6;&#x53D1;&#x5DF2;&#x7ECF;&#x58F0;&#x660E;&#x7684;&#x6240;&#x6709;&#x5B88;&#x536B;

    + &#x5C0F;&#x7A0B;&#x5E8F;&#x7AEF;&#x9ED8;&#x8BA4;&#xFF1A;&#x63D2;&#x4EF6;api&#x8DF3;&#x8F6C;&#x3001;uni&#x5BFC;&#x822A;api&#x8DF3;&#x8F6C;&#x548C;&#x9996;&#x5C4F;&#x52A0;&#x8F7D;
    + &#x4F7F;&#x7528;&#x8DEF;&#x7531;&#x5B88;&#x536B;&#xFF1A;&#x901A;&#x8FC7;&#x70B9;&#x51FB;&#x4E8B;&#x4EF6;&#x5F3A;&#x5236;&#x89E6;&#x53D1;&#x3001;&#x6DF7;&#x5165;&#x5230;onshow&#x56DE;&#x8C03;&#x89E6;&#x53D1;
* &#x8DF3;&#x8F6C;&#x8DEF;&#x7531;&#x9501;&#xFF1A;animationDuration&#x4FDD;&#x7559;&#x7ED9;redirection\push&#x8DB3;&#x591F;&#x65F6;&#x95F4;&#xFF0C;&#x7B49;&#x5207;&#x6362;&#x5B8C;&#x6210;&#x9875;&#x9762;&#x540E;&#x624D;&#x653E;&#x884C;&#x4E0B;&#x6B21;&#x8DF3;&#x8F6C;

const router = createRouter({
platform: process.env.VUE_APP_PLATFORM,
// ① 路由锁
applet: {
animationDuration: 300 // 默认300ms
// animationDuration: 0 // 不精准 只捕捉跳转api下的complete函数
},
// ②优雅解锁 error.type: 0 表示 next(false)、1表示next(unknownType)、2表示加锁状态,禁止跳转、3表示在获取页面栈时,页面栈不够level获取
routerErrorEach:(error, router) => {
if (error.type === 3) {
router.$lockStatus = false
}
},
routes: […ROUTES]
})


##### &#x56DB;&#x3001;&#x8DEF;&#x7531;&#x8DF3;&#x8F6C;

###### 4.1 &#x7EC4;&#x4EF6;&#x8DF3;&#x8F6C;

* vue-router&#x4E2D;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;router-link&#x7EC4;&#x4EF6;&#x8FDB;&#x884C;&#x9875;&#x9762;&#x8DF3;&#x8F6C;&#xFF0C;uni-simple-router&#x4E5F;&#x63D0;&#x4F9B;&#x4E86;&#x7C7B;&#x4F3C;&#x7684;&#x7EC4;&#x4EF6;&#xFF0C;&#x9700;&#x8981;&#x624B;&#x52A8;&#x6CE8;&#x518C;
* 
  // main.js
  import Link from './node\_modules/uni-simple-router/dist/link.vue'
  Vue.component('Link', Link)

</code></pre>
<p>*</p>
<pre><code>// 通过path直接跳转 并指定跳转类型
<link to="/tabbar1" navtype="pushTab">
    <button type="primary">使用path对象跳转button>
Link>

</button>
</code></pre>
<pre><code>
###### 4.2 编程式导航

* 通过this.$Router获取路由对象;push、pushTab、replace、back等api进行路由跳转
* 注:path搭配query参数、name搭配params参数
* 导航使用方式同vue-router

##### 五、跨平台模式

###### 5.1 提前享用生命周期

* uniapp由于只用onLoad接受options参数、onShow不接受;传递深度对象参数时,需要先编码再传递解码
* 
  // &#x52A8;&#x6001;&#x6539;&#x53D8;&#x53C2;&#x6570; &#x4F7F; onLoad&#x548C;onShow&#x652F;&#x6301;options
  const router = createRouter({
    platform: process.env.VUE\_APP\_PLATFORM,
    routes: [...ROUTES],
    beforeProxyHooks: {
        onLoad(options, next){
            next([router.currentRoute.query]);
        },
        onShow([options], next){
            console.log(this);
            const args=options||router.currentRoute.query;
            next([args]);
        },
    },
  });

  • 全局前置守卫
/**
* to: Route &#x5373;&#x5C06;&#x8FDB;&#x5165;&#x7684;&#x76EE;&#x6807;
* from: Route &#x5F53;&#x524D;&#x5BFC;&#x822A;&#x6B63;&#x8981;&#x79BB;&#x5F00;&#x7684;&#x8DEF;&#x7531;
* next: Function &#x8BE5;&#x65B9;&#x6CD5;&#x7684;resolve&#x94A9;&#x5B50;&#x51FD;&#x6570;&#x5FC5;&#x987B;&#x8C03;&#x7528;&#xFF0C;&#x6267;&#x884C;&#x6548;&#x679C;&#x4F9D;&#x8D56;next&#x65B9;&#x6CD5;&#x7684;&#x8C03;&#x7528;&#x53C2;&#x6570;
* -- next()&#x8C03;&#x7528;&#x53C2;&#x6570;&#xFF1A;&#x7BA1;&#x9053;&#x4E2D;&#x7684;&#x4E0B;&#x4E2A;&#x94A9;&#x5B50;&#xFF1B; next(false)&#x4E2D;&#x65AD;&#x5F53;&#x524D;&#x5BFC;&#x822A;&#xFF1B;
* -- next('/')/({path: '/'})&#x8DF3;&#x8F6C;&#x5230;&#x4E00;&#x4E2A;&#x4E0D;&#x540C;&#x7684;&#x5730;&#x5740;&#x3002;&#x5F53;&#x524D;&#x7684;&#x5BFC;&#x822A;&#x88AB;&#x4E2D;&#x65AD;&#xFF0C;&#x7136;&#x540E;&#x8FDB;&#x884C;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x5BFC;&#x822A;
* -- next({delta: 2, NAVTYPE: 'back'}) &#x4E2D;&#x65AD;&#x5F53;&#x524D;&#x5BFC;&#x822A;&#xFF0C;&#x8C03;&#x7528;&#x65B0;&#x7684;&#x8DF3;&#x8F6C;&#x7C7B;&#x578B;&#xFF0C;&#x540C;&#x65F6;&#x8FD4;&#x56DE;&#x4E24;&#x5C42;&#x9875;&#x9762;
**/
router.beforeEach((to, from, next) => {
  // ...

  // 1&#x20E3; next()
  // 2&#x20E3; NAVTYPE&#x5B9A;&#x4E49;&#x8DF3;&#x8F6C;&#x65B9;&#x5F0F;&#xFF0C;&#x4E24;&#x8005;&#x76F8;&#x540C;&#x975E;&#x5FC5;&#x586B;
  if (to.name == 'tabbar-5') {
        next({
            name: 'router4',
            params: {
                msg: '&#x6211;&#x62E6;&#x622A;&#x4E86;tab5&#x5E76;&#x91CD;&#x5B9A;&#x5411;&#x5230;&#x4E86;&#x8DEF;&#x7531;4&#x9875;&#x9762;&#x4E0A;',
            },
            NAVTYPE: 'push'
        });
    } else{
    next();
  }
})

  • 全局后置守卫
// &#x4E0D;&#x63A5;&#x53D7;next&#x51FD;&#x6570;&#x4E5F;&#x4E0D;&#x6539;&#x53D8;&#x5BFC;&#x822A;&#x672C;&#x8EAB;
router.afterEach((to,from) => {})

  • 路由独享守卫
// &#x8DEF;&#x7531;&#x914D;&#x7F6E;&#x4E0A;&#x76F4;&#x63A5;&#x5B9A;&#x4E49;beforeEnter&#x5B88;&#x536B;
const router = createRouter({
  routes: [{
    path: '/pages/home/index',
    beforeEnter:(to,from,next) => {
     // &#x53C2;&#x6570;&#x540C;&#x4E0A;&#x5168;&#x5C40;&#x524D;&#x7F6E;&#x5B88;&#x536B;
      next()
    }
  }]
})

  • 组件内的守卫
// &#x7EC4;&#x4EF6;&#x5185;&#x914D;&#x7F6E;beforeRouteLeave&#x5B88;&#x536B; - &#x76F4;&#x63A5;&#x8C03;&#x7528;beforeRouteLeave&#x65B9;&#x6CD5;
export default {
  beforeRouteLeave(to, from, next) {
    // &#x5BFC;&#x822A;&#x79BB;&#x5F00;&#x8BE5;&#x7EC4;&#x4EF6;&#x7684;&#x5BF9;&#x5E94;&#x8DEF;&#x7531;&#x65F6;&#x8C03;&#x7528;
    // &#x53EF;&#x4EE5;&#x8BBF;&#x95EE;&#x7EC4;&#x4EF6;&#x5B9E;&#x4F8B;this
    next()
  }
}

// 1&#x20E3; &#x521B;&#x5EFA; router&#x6587;&#x4EF6;&#x5939;&#xFF0C;&#x6A21;&#x5757;&#x5316;&#x914D;&#x7F6E; &#x6587;&#x4EF6;&#x7ED3;&#x6784;
|+------------------------+|
| router                   |
| |+--------------------+| |
| | modules              | |
| | |+----------------+| | |
| | | home.js          | | |
| | | index.js         | | |
| | |+----------------+| | |
| |+--------------------+| |
| index.js                 |
|+------------------------+|

// home.js
const home = [
  {
    path: '/pages/home/index',
    name: 'home'
  }
]
export default home

// modules&#x4E0B;&#x7684;index.js&#x662F;&#x4E00;&#x4E2A;&#x6A21;&#x5757;&#x8BFB;&#x53D6;
// &#x2460; require.context(directory, useSubdirectories, regExp) &#x5177;&#x4F53;&#x8BE6;&#x60C5;&#xFF1A;&#x5982;&#x4E0B;&#x6269;&#x4E09;
const files = require.contxt('.',false,/.js$/)
const modules = []

files.keys().froEach(key => {
  if (key === './index.js') return
  const item = files(key).default
  modules.push(...item)
})

export default modules // &#x5C06;&#x6240;&#x6709;&#x6A21;&#x5757;&#x7684;&#x8DEF;&#x7531;&#x6A21;&#x5757;&#x6574;&#x5408;&#x5230;&#x4E00;&#x8D77;&#xFF0C; routes Array

// router&#x4E0B;&#x7684;index.js &#x8DEF;&#x7531;&#x5B88;&#x536B;
import modules from './modules/index.js'
import Vue from 'vue'
import CreateRouter from 'uni-simple-router'
import store from '@/store/store.js'

Vue.use(CreateRouter)
//&#x521D;&#x59CB;&#x5316;
const router = new CreateRouter({
 APP: {
  holdTabbar: false //&#x9ED8;&#x8BA4;true
 },
 h5: {
  vueRouterDev: true, //&#x5B8C;&#x5168;&#x4F7F;&#x7528;vue-router&#x5F00;&#x53D1; &#x9ED8;&#x8BA4; false
 },
 // &#x4E5F;&#x53EF;&#x4EE5; &#x901A;&#x8FC7;uni-read-pages&#x6765;&#x8BFB;&#x53D6;pages.json&#x6587;&#x4EF6;&#x7684;&#x8DEF;&#x7531;&#x8868;&#xFF0C;&#x914D;&#x5408;vue.config.js
 // router: [...ROUTES] // ROUTES&#x662F;&#x901A;&#x8FC7;webpack&#x7684;defaultPlugin&#x7F16;&#x8BD1;&#x6210;&#x5168;&#x5C40;&#x53D8;&#x91CF;&#xFF0C;&#x5177;&#x4F53;&#x64CD;&#x4F5C;&#x4E0A;&#x6587;
 routes: [...modules] //&#x8DEF;&#x7531;&#x8868;
});

//&#x5168;&#x5C40;&#x8DEF;&#x7531;&#x524D;&#x7F6E;&#x5B88;&#x536B;
router.beforeEach((to, from, next) => {
 // &#x9996;&#x5148;&#x5224;&#x65AD;&#x662F;&#x5426;&#x5B58;&#x5728;&#x8DEF;&#x7531;&#x4FE1;&#x606F;
 //&#x4E0D;&#x5B58;&#x5728;&#x5C31;&#x5148;&#x8C03;&#x7528;&#x63A5;&#x53E3;&#x5F97;&#x5230;&#x6570;&#x636E;
})
// &#x5168;&#x5C40;&#x8DEF;&#x7531;&#x540E;&#x7F6E;&#x5B88;&#x536B;
router.afterEach((to, from) => {})
export default router;

// require.context(directory, useSubdirectories, regExp)
// directory: &#x8868;&#x793A;&#x68C0;&#x7D22;&#x7684;&#x76EE;&#x5F55;
// useSubdirectories: &#x8868;&#x793A;&#x662F;&#x5426;&#x68C0;&#x7D22;&#x5B50;&#x6587;&#x4EF6;&#x5939;
// regExp: &#x5339;&#x914D;&#x6587;&#x4EF6;&#x7684;&#x6B63;&#x5219;&#x8868;&#x8FBE;&#x5F0F;
// &#x8FD4;&#x56DE;&#x503C;&#xFF1A; resolve&#x662F;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#xFF0C;&#x8FD4;&#x56DE;&#x5DF2;&#x89E3;&#x6790;&#x8BF7;&#x6C42;&#x7684;&#x6A21;&#x5757;ID&#xFF1B; keys&#x662F;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#xFF0C;&#x5B83;&#x8FD4;&#x56DE;&#x4E0A;&#x4E0B;&#x6587;&#x6A21;&#x5757;&#x53EF;&#x4EE5;&#x5904;&#x7406;&#x7684;&#x6240;&#x6709;&#x53EF;&#x80FD;&#x8BF7;&#x6C42;&#x7684;&#x6570;&#x7EC4;&#xFF1B;
// &#x4F7F;&#x7528;&#x573A;&#x666F;&#xFF1A;&#x2460;&#x7528;&#x6765;&#x7EC4;&#x4EF6;&#x5185;&#x5F15;&#x5165;&#x591A;&#x4E2A;&#x7EC4;&#x4EF6;&#xFF1B;&#x2461;&#x5728;main.js&#x5185;&#x5F15;&#x5165;&#x5927;&#x91CF;&#x516C;&#x5171;&#x7EC4;&#x4EF6;&#xFF1B;

// &#x2460;&#x7EC4;&#x4EF6;&#x5185;&#x5F15;&#x5165;&#x591A;&#x4E2A;&#x7EC4;&#x4EF6; - webpack
const path = require('path')
const files = require.context('@/components/home', false, /\.vue$/) //&#x503C;&#x7C7B;&#x578B; ['./home.js', 'detail.js',...]
const modules = {}

files.keys().forEach(key => {
  const name = paths.basename(key, '.vue') // &#x53BB;&#x6389;&#x6587;&#x4EF6;&#x540D;&#x7684; .vue&#x540E;&#x7F00;
  modules[name] = files(key).default || files(key)
})
// modules { home: '{module&#x6837;&#x5F0F;&#x8DEF;&#x5F84;}', detail: '{}', ... }
export default {
    ...,
    data() { return {}},
    components: modules
}

// &#x2461;&#x5728;main.js&#x5185;&#x5F15;&#x5165;&#x5927;&#x91CF;&#x516C;&#x5171;&#x7EC4;&#x4EF6;
import Vue from 'vue'
// &#x5F15;&#x5165;&#x81EA;&#x5B9A;&#x4E49;&#x7EC4;&#x4EF6;
const requireComponents = require.context('../views/components',true,'/\.vue/')
// &#x904D;&#x5386;&#x51FA;&#x6BCF;&#x4E2A;&#x6570;&#x7EC4;&#x7684;&#x8DEF;&#x5F84;
requireComponents.keys().forEach(fileName => {
  const reqCom = requireComponents(fileName)
  // &#x83B7;&#x53D6;&#x7EC4;&#x4EF6;&#x540D;
  const reqComName = reqCom.name || fileName.replace(/\.\/(.*)\.vue/, '$1')
  // &#x7EC4;&#x4EF6;&#x6302;&#x8F7D;
  Vue.components(reqComName, reqCom.default || reqCom)
})

Original: https://blog.csdn.net/u013190417/article/details/125057190
Author: 虚幻私塾
Title: uni-simple-router

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/746895/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球