nej 搭配 vue 方案
此文已由作者张磊授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
前言
目前项目使用的技术是 nej + regular,路由方面是使用 nej 自带的,随着时间推移,项目已经上线很多模块,这时想尝试新技术,不可能推倒重来,只能边做边重构。想引入新技术,比如引入 vue,那么就会遇到一个问题,如何和已有的代码进行融合。
方案
方案整理下来有两种:
代码整合写在一起
需要考虑的点:代码耦合在一起,在项目重构后期,需要剥离代码,那么就应该提前设计好方案,方便后续剥离代码。新模块代码通过 iframe 加载引用
好处的话,代码隔离,相当于新启一个项目,没有包袱,但坏处也有,由于加载时间过长会有一定时间的白屏。同时需要做好主页面和子页面的消息通知机制。
说明
这两种方案,都有特殊的一点,需要由 nej 路由去驱动 vue 路由。这样设计的目的,一方面在方案1的情况下,两个路由系统不会冲突,同时监听 location 变化,可能会出意料之外的问题;另一方面即使解决上一个问题,同时还需要适配 nej 路由的写法;再者,在后期即使想下掉 nej 路由,也只需要修改少量的代码即可;再者想在 url 处展示参数变化,也只需要做好同步机制,修改一个即可。那么想达到这样的方案,就需要其中一个路由系统可以不监听 location 的改变,刚好 vue-router 是支持的。有了 abstract 模式,就可以完美解决路由冲突。
实现
目前实现了 方案1 的 demo。
首先在 nej 路由指定好路由起点
['/m/demo/', 'demo', 'module/demo/tmp.html', 'demo', ''],
['/m/demo2', 'demo', 'module/demo/tmp.html', 'demo2', ''], // 加不加最后的 / 是有区别的剩下的需要修改的文件均在这个链接的 demo 文件夹下,下载后放置正确即可。
运行后,会发现只能运行一次,第二次进入页面会失效。这个问题的原因是 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
动图
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 MongoDB复制集成员及状态转换
nej 搭配 vue 方案的更多相关文章
- 安装搭配VUE使用的UI框架ElementUI
可以搭配vue的UI框架有几个,我用的是element-ui,现在呢,我要在复习一遍 1.vue init webpack-simple element-ui2.cd element-ui3.npm ...
- ThinkJS前端搭配vue时的Nginx配置
Thinkjs 作为奇舞团开源的nodejs mvc框架之一,引起了很多NodeJS程序员的亲赖.但是其关于静态文件处理部分支持不够完善,主要是体现在SPA单页应用,之前在ThinkJS 2.*版本时 ...
- Redux/Mobx/Akita/Vuex对比 - 选择更适合低代码场景的状态管理方案
近期准备开发一个数据分析 SDK,定位是作为数据中台向外输出数据分析能力的载体,前端的功能表现类似低代码平台的各种拖拉拽.作为中台能力的载体,SDK 未来很大概率会需要支持多种视图层框架,比如Vue2 ...
- vue路由异步组件案例
最近研究了vue性能优化,涉及到vue异步组件.一番研究得出如下的解决方案. 原理:利用webpack对代码进行分割是异步调用组件前提.异步组件在优先级上让位同步组件.下面介绍的是怎么实现异步组件. ...
- Vue学习记录-画页面
webstorm 因为之前开发ReactNative的时候,选择了webstorm,这回转战Vue,自然还是用它.如果什么也不做的话,打开Vue工程,编辑区域基本上没有语法高亮.怎么办呢? 安装插件( ...
- vue post请求 参数带有中文后端无法接收或者收到乱码,无法返回数据问题
问题来源: 在使用axios时,和java联调,发现调接口服务器始终拿不到参数data,但是检查network也的确传了data,才有了该文章. 基于 vue-axios 和 $.ajax 两种请求方 ...
- 关于 Vue 中 h() 函数的一些东西
最近在项目上需要一个信息弹窗,来显示信息.一开始只让它弹出了文字,而且只有一条信息.而给我的需求是多条文字和图片,而后我使用了element ui中的 Notification 通知组件来显示.当然, ...
- [题解]noip2016普及组题解和心得
[前言] 感觉稍微有些滑稽吧,毕竟每次练的题都是提高组难度的,结果最后的主要任务是普及组抱一个一等奖回来.至于我的分数嘛..还是在你看完题解后写在[后记]里面.废话不多说,开始题解. 第一题可以说的内 ...
- 图表控件== 百度 echarts的入门学习
花了3天的时间 去学习跟试用之前两款的图表控件 hightcharts(商业,人性化,新手非常方便试用,图表少了点) 跟chartjs==>搭配vue更好 控件,整体而言都还可以. http:/ ...
随机推荐
- CodeForces 455C Civilization(并查集+树直径)
好久没有写过图论的东西了,居然双向边要开两倍空间都忘了,不过数组越界cf居然给我报MLE??这个题题意特别纠结,一开始一直不懂添加的边长是多长... 题意:给你一些点,然后给一些边,注意没有重边 环, ...
- php一维数组的创建
php一维数组的创建 (1)通过array函数声明数组 使用array 函数定义数组,该函数返回通过所接受接收的参数建立的数组.array 函数使用的格式如下. $arry_name = array( ...
- IE6、IE7、IE8及其他浏览器多个元素并排显示
IE6.IE7.IE8及其他浏览器多个元素并排显示 HTML代码 <div class="line"> <h1>全部input框</h1> &l ...
- Mac 上Sublime Text 2配置lua环境
1,首先下载最新版lua 然后解压到你想解压到的位置 http://www.lua.org/ftp/ 2,运行终端,cd 进入该文件夹src目录下. 3,在终端输入 make macosx ...
- java:安装tomcat8/tomcat9(简单安装配置)
java:安装tomcat8/tomcat9(简单安装配置) pache-tomcat-8.5.23(免安装板) 1.安装完成后右击我的电脑—属性—高级系统设置—环境变量, 在系统变量中添加以下变量 ...
- JAVA堆内存和栈内存初步了解
一.堆内存和栈内存 程序运行时内存分配有三种:静态存储分配,栈式存储分配,堆式存储分配 1.静态存储分配: 在程序编译时就可以确定数据目标在运行时所需要的内存,因此在编译时就为其分配固定大小的内存. ...
- Oracle中spool命令实现的两种方法比较
---恢复内容开始--- 要输出符合要求格式的数据文件只需在select时用字符连接来规范格式.比如有如下表 SQL>; select id,username,password from myu ...
- 使用Rancher搭建K8S测试环境
使用Rancher搭建K8S测试环境 http://blog.csdn.net/csdn_duomaomao/article/details/75316926 环境准备(4台主机,Ubuntu16.0 ...
- AI-Info-Micron-Menu:About Micron
ylbtech-AI-Info-Micron-Menu:About Micron 将数据带入生活 美光科技的存储技术帮助将海量数据化为宝贵见解,重新定义世界使用信息的方式. 1.返回顶部 1. 公司简 ...
- HTTP返回码中301与302的区别
一.官方说法 301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于: 301 redirect: 301 代表永久性转移(Permanently Moved). 302 ...