预览模式: 普通 | 列表

同步发到 https://zhuanlan.zhihu.com/p/584197370

 

项目是用一个git进行管理的。开发时经常需要三端联动调试,一个个启动太麻烦了。于是找了个办法进行多端同时启动,并实现了前后端的热更新。

package.json是根目录的那个,并不是admin(vue)的那一个。主要配置如下:

concurrently用来同时启动两个npm run命令

nodemon是普通node命令的一个替代品,可以实现node开发时的热更新

查看更多...

分类:前端研究 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 1735

 2022年7月,element-ui主题(theme)编辑器一段时间老是报timeout问题,等了一二周也没见解决。一个偶然机会找到一个网上项目,让element官网可以在本地跑起来,当然也可以做theme编辑,特此分享。用这种方法编辑element外观,才是最正规的方法。

 
使用起来很简单,先按package.json中的配置,把项目把本地站跑起来。
 
在本地站编辑完,点“下载”,生成zip压缩包,将压缩包中的theme目录放到特定位置,然后在项目的main.js中引入这个index.css就行了。
 
分类:前端研究 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 2106

websocket前后端通讯模拟

 前端VUE代码:

Javascript代码
  1. test_ws() {  
  2.   // let websocket;  
  3.   let url = `ws://192.168.0.73:54000?id=888`;  
  4.   let websocket = new WebSocket(url,['token340987340697']);  
  5.     // 建立连接  
  6.     websocket.onopen = () => {  
  7.       // 发送数据  
  8.       console.clear();  
  9.       console.log("websocket发送数据中",websocket);  
  10.       websocket.send("发送数据!!!!!!");  
  11.     };  
  12.     // 客户端接收服务端返回的数据  
  13.     websocket.onmessage = evt => {  
  14.       console.log("websocket返回的数据:", evt.data);  
  15.     };  
  16.     // 发生错误时  
  17.     websocket.onerror = evt => {  
  18.       console.log("websocket错误:", evt);  
  19.     };  
  20.     // 关闭连接  
  21.     websocket.onclose = evt => {  
  22.       console.log("websocket关闭:", evt);  
  23.     };  
  24.   
  25.     this.my_ws = websocket   
  26. },  

后端node.js+koa:

Javascript代码
  1. app.ws.use((ctx, next) => {  
  2.     /* 每打开一个连接就往 上线文数组中 添加一个上下文 */  
  3.     ctxs.push(ctx);  
  4.     // console.log("🚀 ### ctx1",ctx.query.id)  
  5.     console.log("🚀 @@@@@@@@@@@", ctx.header["sec-websocket-protocol"])  
  6.     ctx.websocket.send("start!!!!"+_.random(999, 9999))  
  7.     ctx.websocket.on("message", (msg) => {  
  8.         console.log("🚀 ### msg2", msg.toString())  
  9.         if (ctx.query.id == '10001') {  
  10.             msg1.push(msg.toString())  
  11.         }  
  12.         if (ctx.query.id == '10002') {  
  13.             msg2.push(msg.toString())  
  14.         }  
  15.         /* for(let i = 0; i < ctxs.length; i++) { 
  16.             if (ctx != ctxs[i]) { 
  17.                 ctxs[i].websocket.send(message) 
  18.             } 
  19.         } */  
  20.     });  
  21.       
  22.     // 客户端主动断开链接时候用 可以先不管  
  23.     ctx.websocket.on("close", (message) => {  
  24.         console.log(ctx.query.id,"🚀 ### close###########")  
  25.         console.log(msg1);  
  26.         console.log('---------------');  
  27.         console.log(msg2);  
  28.         /* 连接关闭时, 清理 上下文数组, 防止报错 */  
  29.         let index = ctxs.indexOf(ctx);  
  30.         ctxs.splice(index, 1);  
  31.     });  
  32. });  

 

分类:前端研究 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 2150

 一个中文化做得比较全的版本,比如中文名,省份,地址,公司名啥的,亲测可用。

https://github.com/layerssss/Faker-zh-cn.js/

 

原作者删库后,被github给冻结了,志愿者重新维护了这个库:https://github.com/faker-js/faker

GITEE国内镜像,未测,https://gitee.com/mirrors/faker-js

 

查看更多...

分类:前端研究 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 2285

vue2实现Teleport,用来做跨组件DOM挂载

 父组件调用:(to="#app"的意思是把#divPopup挂载到#app节点上

Javascript代码
  1. <Teleport to="#app">  
  2.         <div id="divPopup" style="z-index:20000;" v-show="dialogVisible">  
  3.           <el-button @click="clickH1">yes</el-button>  
  4.           <el-button @click="clickH2">no</el-button>  
  5.         </div>  
  6. </Teleport>  

子组件:

Javascript代码
  1. <script>  
  2.     export default {  
  3.         name: 'teleport',  
  4.         props: {  
  5.             /* 移动至哪个标签内,最好使用id */  
  6.             to: {  
  7.                 type: String,  
  8.                 required: true  
  9.             }  
  10.         },  
  11.   
  12.         mounted() {  
  13.             document.querySelector(this.to).appendChild(this.$el)  
  14.         },  
  15.   
  16.         destroyed() {  
  17.             document.querySelector(this.to).removeChild(this.$el)  
  18.         },  
  19.   
  20.         render() {  
  21.             return <div>{this.$scopedSlots.default()}</div>  
  22.         }  
  23.     }  
  24. </script>  

 

分类:前端研究 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 2967

一个swiper双向移动的例子

分类:我们的作品 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 2231

飞机探测地块的一个小演示动画

分类:我们的作品 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 2135

一个帧动画--仿做

分类:前端研究 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 2272

前端开发经常在vue-cli、小程序中切换,所以要搭建一个独立的mock环境,json-server就很符合我的需要。它就是独立的node程序,使用时用单独的命令行启动。常见使用场景就是, json-server全局安装,每个项目需要的mock配置放在mock目录下,要使用时,只要用单独的命令行启动即可。
 
 
常用的启动命令如下:
json-server --watch --port 53000 ./mock/mock.js --middlewares ./mock/middlewares.js
 
在vue中使用时,可以在package.json中做如下关联:
Javascript代码
  1. "scripts": {  
  2.   "mock""json-server --watch --port 53000 ./mock/mock.js --middlewares ./mock/middlewares.js"...  
  3. },  
这样就可以使用npm run mock来启动了。生成的接口类似这样:
mock.js是项目配置文件,我加了一段函数walkSync,用于遍历mock/api目录,这样复杂点的接口,直接在api目录下写个js文件就可以模拟了(支持mock.js语法)。
 
还是以项目中的login.js为例:
Javascript代码
  1. //login.js  
  2. module.exports = {  
  3.     "token""@guid()",  
  4.     "user_info": {  
  5.         'uid|3333-9999': 100,  
  6.         'organ''@ctitle(2, 3)研究所',  
  7.         'name''@cname',  
  8.         'level|1': [0]  
  9.     }  
  10. }  
简单点的接口,比如那种只要返回个成功信息的接口,我就在mock.js中直接生成了,比如:
Javascript代码
  1. {  
  2.     "code": 200,  
  3.     "data": {flag:true},  
  4.     "msg"''  
  5. }  
 json-server及mock.js的常规用法,网上文档很多,不赘述。

 

分类:前端研究 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 2423
例题,比如,有这样一个对象:
Javascript代码
  1. let arr = [  
  2.   {id:1,tit:'ttt1'},  
  3.   {id:2,tit:'ttt2',bb:{ cc:{dd:12} }},  
  4.   {id:3,tit:'ttt3',bb:{}},  
  5.   {id:5,tit:'ttt5',bb:{ cc:{dd:''}}},  
  6.   {id:6,tit:'ttt6',bb:{ cc:{dd:null}}},  
  7.   {id:7,tit:'ttt7'},  
  8. ]  
分支内的数据不太规范,有的分支多,有的少。现在要求:输出所有含有dd属性的一级分支(dd如为空值也要排除掉)
想想,怎么写?
 
直接给答案吧,lodash大法好,清晰优美,而且是带变量的写法,不管有多深,一探到底:
Javascript代码
  1. _.each(arr, item=>{  
  2.   let flag = _.get(item, [ 'bb''cc''dd' ])  
  3.   if(flag){  
  4.     console.log(item)  
  5.   }  
  6. })  
另外,_.isEmpty这个函数也很好用,用于空值判断,可以判断各种不同的空值,比如对象空,数组空,字符空。
分类:前端研究 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 2530