• nej 搭配 vue 方案


    此文已由作者张磊授权网易云社区发布。

    欢迎访问网易云社区,了解更多网易技术产品运营经验。

    前言


    目前项目使用的技术是 nej + regular,路由方面是使用 nej 自带的,随着时间推移,项目已经上线很多模块,这时想尝试新技术,不可能推倒重来,只能边做边重构。想引入新技术,比如引入 vue,那么就会遇到一个问题,如何和已有的代码进行融合。


    方案


    方案整理下来有两种:


    1. 代码整合写在一起 需要考虑的点:代码耦合在一起,在项目重构后期,需要剥离代码,那么就应该提前设计好方案,方便后续剥离代码。

      Alt pic

    2. 新模块代码通过 iframe 加载引用 好处的话,代码隔离,相当于新启一个项目,没有包袱,但坏处也有,由于加载时间过长会有一定时间的白屏。同时需要做好主页面和子页面的消息通知机制。

      Alt pic


    说明


    这两种方案,都有特殊的一点,需要由 nej 路由去驱动 vue 路由。这样设计的目的,一方面在方案1的情况下,两个路由系统不会冲突,同时监听 location 变化,可能会出意料之外的问题;另一方面即使解决上一个问题,同时还需要适配 nej 路由的写法;再者,在后期即使想下掉 nej 路由,也只需要修改少量的代码即可;再者想在 url 处展示参数变化,也只需要做好同步机制,修改一个即可。那么想达到这样的方案,就需要其中一个路由系统可以不监听 location 的改变,刚好 vue-router 是支持的。有了 abstract 模式,就可以完美解决路由冲突。


    Alt pic


    实现


    目前实现了 方案1 的 demo。


    1. 首先在 nej 路由指定好路由起点

       ['/m/demo/', 'demo', 'module/demo/tmp.html', 'demo', ''],
       ['/m/demo2', 'demo', 'module/demo/tmp.html', 'demo2', ''],  // 加不加最后的 / 是有区别的
    2. 剩下的需要修改的文件均在这个链接的 demo 文件夹下,下载后放置正确即可。

    3. 运行后,会发现只能运行一次,第二次进入页面会失效。这个问题的原因是 nej 会缓存当前页面的 dom,结果把上次 vue 的内容给缓存下来了,再次进来的时候,相当于有两份相同的 dom, 导致页面无法正常显示。解决问题的办法也很简单,找到 regularModule.js,添加 __resetBody 方法的调用。__resetBody 的方法已经写在 demo/index.js 内了。


        _pro.__build = function () {
    +        this.__resetBody();
    +    _pro.__resetBody = function __resetBody(params) {
    +        if (this._$$InnerModule.__resetBody) {
    +            this.__body = this._$$InnerModule.__resetBody(this.__body);
    +        }
    +    };

    问题


    方案1下如何正确解析打包 .vue 文件进行打包,目前想到的办法,可能需要对 vue 打包一次,再用 nej 打包一次。或者如 demo 中的那种写法;再者也可以把项目的打包方案切换成 webpack


    动图


    Alt pic


    免费体验云安全(易盾)内容安全、验证码等服务

    更多网易技术、产品、运营经验分享请点击


    相关文章:
    【推荐】 MongoDB复制集成员及状态转换

  • 相关阅读:
    论线段树:二
    BST 二叉搜索树
    论线段树:一
    [luoguP3627][APIO2009]抢掠计划
    二分图匹配(匈牙利算法)
    SPFA 全面讲解
    markdown的常用高级操作。
    UVA11235 Frequent values
    P2279 [HNOI2003]消防局的设立
    P2216 [HAOI2007]理想的正方形
  • 原文地址:https://www.cnblogs.com/163yun/p/9913596.html
Copyright © 2020-2023  润新知