我开发了一款基于web容器的前端项目容器

目前使用比较多的web容器有哪些:

  • Apache php应用大多数用这个

  • Nginx node应用基本都用这个

  • Tomcat java应用基本都用这个

  • IIS .net应用基本用这个 windows服务器才能用 linux的话有宇内大神开发的Jexus

前端基本都是node应用,据我了解大体上分2种

  • 一种是 最终打包成静态文件(html,css,js等),路由啥的都是前端代码控制,完全不用考虑写后端代码,一般这种都是纯前后端分离的项目

  • 另外一种除了上面说的,还需要用node写部分服务端代码,一般这种需要做SSR(服务端渲染)

我接触下来大部分前端开发者的强项在于第一种,即使要做SSR的也不会是很重量级的(比如操作db等,数据在缓存redis里面或者在配置文件里,否则渲染就慢了)

前端基本都是node应用,nginx为例子,linux服务器上安装好nginx后

  • 把代码传到服务器

  • 配置nginx 把流量转发到你的node应用

可能你觉得就这点 也不麻烦啊,不就操作配置一次就好了么。

但是你后面修改代码后,重新上传,代码有问题想要回滚,git回滚或者手动代码回滚,重新上传。

有很多重复性操作,效率不高!

注意 以上我说的是脱离了公司的环境(CICD集成的发布系统)自己独立部署会遇到一些麻烦问题

下面给大家介绍下我开源这个web容器:让前端开发者可以自给自足速快速部署&回滚,让开发者只专注于用前端技术实现业务,一个开箱即用的开源web容器来鼠标点几下就完成部署&回滚&还可以SSR

功能一览:

  • 前端应用开发完后打包后自助上传部署(通过管理后台)

  • 配合服务端脚本实现服务端渲染SSR功能

  • 可以快速回滚到上一个版本(发上去有问题一键回滚)

  • 可以设置环境变量供SSR功能使用(简单上手)

  • 服务端脚本提供log redis db http四大插件打造强大的基于js的ssr服务端运行脚本功能(特色)

  • 服务端js脚本编辑器有智能代码提示(特色)

  • Docker快速启动服务,一行命令搞定一个前端web容器(基于容器技术)

  • 支持tls(安全可靠)

00.Docker Quick Start

拉取镜像并且Run 一行命令完成web容器部署

docker run -d -v $(pwd)/spa/wwwroot:/publish/wwwroot -v $(pwd)/spa/backup:/publish/backup -e BasicAuth_Name=’admin’ -e BasicAuth_Pwd=’admin’ -e AllowedFileExtentionMapping=’’ -e NotAllowedFileExtentions=’’ -e BackUpLimit=’1’ —restart=always -p 80:5000 —name spa nainaigu/spa:20200915222842

参数说明

  • BasicAuth_Name:spa后台的登录用户名

  • BasicAuth_Pwd:spa后台的登录密码

  • AllowedFileExtentionMapping:选填 除了aspnetcore默认的mapping以外还要追加配置有些特殊的文件后缀访问 格式为[后缀格式->返回类型 多个用半角逗号隔开] 例如:.plist->application/xml,.ipa->application/octet-stream

  • NotAllowedFileExtentions:选填 配置哪些静态文件是不允许访问的,多个用半角分号隔开[为空的话默认为: appsettings.json;.map] 代表不能访问文件名称为 appsettings.json 和 后缀为.map 的文件,会直接返回503

  • BackUpLimit:选填 默认1 代表每个项目的发布的历史记录保存个数,供快速回滚使用

剩余的就打开浏览器访问spa管理后台 点击即可

http://xxx/admin

02.单页面应用规范

系统跑起来之后,我们的前端容器就已经搞定了。前端开发者就可以自己动手部署了!

什么是单页面应用呢?

  • 就是指一个系统只加载一次资源,之后的操作交互、数据交互是通过路由、ajax来进行,页面并没有刷新。

  • 特点是加载次数少,加载以后性能较高

    对于本套系统的规范

  • 不管你用什么前端技术,只要是 静态的html,js,css 的前端资源,就可以部署到本系统!

  • 需要有一个约束 需要有index.html

  • 因为单页面的入口是 index.html

例如下面的例子:

在index.html里面的css和js的引用需要注意的点

得是 ./开头的方式引用,否则发布上去会找不到(用./方式的话本地调试直接访问和部署上去访问都会是没问题的)

使用vue cli创建的项目设置

如上图目录结构中

1 修改vue.config.js中配置

module.exports = {publicPath:process.env.PUBLIC_PATH
}

2 修改.env文件配置 PUBLIC_PATH = ././

3 修改.env.development 文件配置 PUBLIC_PATH = .

如果你不设置.env文件的话,而是分别设置.env.development 和 .env.production 的话 那么 .env.production也得设置为 PUBLIC_PATH = ././
如果你在.env设置了,production不设置也没关系

对于非vue 用webpack的话对 webpack的配置文件 进行如下设置那么生成的index.html就会自动加上前缀./了

 output: {publicPath: '.'}
使用vue-router等前端路由是支持的

03.单页面应用部署,回滚

下面我们开发一个最简单单页应用

有2个文件

  • index.html

  • index.js

然后我打包成 detai.zip 文件

进入系统 新建一个单页面应用

  • 单页面名称我这里填 detail 发布成功后可以通过

  • 选择刚刚的zip 然后点击【创建并部署】

  • 然后打开 http://localhost:5000/detail 进行确认是否成功 如下图

不用在url上特地带上index.html去访问,意思是 http://localhost:5000/detail 等于 访问了 http://localhost:5000/detail/index.html

接下来我要修改index.html 然后重新部署

重新打包zip 然后

重新访问 http://localhost:5000/detail 进行确认是否修改成功 如下图

大家应该注意到了,前端有改动 只要重新上传立刻生效!

如果发布之后发布改错了咋办,当然是立刻回滚到上一次的上传版本!

如下图 回滚功能:

重新访问 http://localhost:5000/detail 进行确认是否回滚成功 如下图

04.单页面应用做SSR

什么是SSR

通俗来讲就是用js来写服务端代码,在页面渲染的时候通过js服务端代码逻辑就可以把数据可以直接展示在页面中!

首先得理解下面两点

  • 什么是服务端渲染? 关键词:后端代码+模板引擎

  • 什么场景下需要用到服务端渲染?关键词:seo:动态的标题 Description 等meta信息

什么是服务端渲染?下面是我的理解

我写了一个网页,部署到web容器后,我打开浏览器请求,服务端收到请求后 先在服务端读取我的网页的内容,然后结合 后端代码+模板引擎的方式重新渲染再 返回给浏览器展示

什么场景下需要用到服务端渲染?下面是我的理解

当你的页面的标题,Description 等meta信息 需要动态指定的时候。
比如:

产品分享页面

productId=1 productName = “产品A”
http://localhost:5000/detai?productId=1

需要Title要指定为 “产品A”

productId=2 productName = “产品B”
http://localhost:5000/detai?productId=2

需要Title要指定为 “产品B”

要满足这个需求 仅仅靠前端是没有办法完成的。因为你页面在页面ready后再去调用ajax方法是没有办法动态指定Title的。这点可以大家实验实验!

解决方案:服务端代码+模板引擎

本系统最大的亮点来了:模板引擎约定好,前端自己就能搞定服务端js代码

是用上面的 产品分享页面 为例:

如下图,进入单应用的SSR脚本编辑功能

默认 脚本编辑器里面会 写好代码模板, 如下:

module.exports = {main:function (path){}
};

当提交保存 脚本代码后,访问
http://localhost:5000/detai?productId=2
会先把当前页面的请求url 作为path参数传到 脚本的 main 方法!

我们用 log 组件进行打日志记录下:

查看日志:

业务代码
做如下改写SSR脚本:

let log = require('log');module.exports = {main:function (path){log.Info(path);var requestparams = module.exports.GetRequest(path);var productTid = requestparams.productId;if(!productTid) return;if(productTid == 1){return {ProductName:'产品A'};}else if (productTid == 2){return {ProductName:'产品B'};      }else {return {ProductName:'其他产品'};      }},/*** [获取URL中的参数名及参数值的集合]* 示例URL:http://localhost:5000/detail?productId=2* @param {[string]} urlStr [当该参数不为空的时候,则解析该url中的参数集合]* @return {[string]}       [参数集合]*/GetRequest:function (urlStr) {var url = "?" + urlStr.split("?")[1];var theRequest = {};if (url.indexOf("?") != -1) {var str = url.substr(1);strs = str.split("&");for (var i = 0; i < strs.length; i++) {theRequest[strs[i].split("=")[0]] = decodeURI(strs[i].split("=")[1]);}}return theRequest;}
};

注意:上面我把main方法改造了 返回了 一个 对象

{"ProductName" : "xxxxxx"}

脚本代码智能提示

模板引擎其实很简单:

SSR脚本返回了什么对象 在html中用 @Model.xxxx 的形式使用!!简单吧!!如下图:

逻辑和上面的SSR脚本一致!

如上我们用SSR脚本代码的业务逻辑 + 模板引擎 解决服务端渲染!

上面的脚本代码我们用了log组件=》方便的把脚本的执行过程中记录日志,
当然了 正常业务的服务端渲染逻辑肯定不是这么简单的,不用担心我们接下来介绍另外3个组件:redis组件 和 db组件 和 http请求组件

服务端脚本的扩展组件介绍

服务端js脚本组件,会js就能写后端逻辑

本系统预制了 log组件 redis组件 db组件 http组件,如果还有其他需要也可以自行扩展

前面我们介绍了log组件。
使用方式:


//DB访问组件
var db = server.create('SQL', {type:'mysql',db:'Server=xxxxx;Port=3306;Database=xx;Uid=xxx;Pwd=ddddd;charset=utf8;SslMode=none'
});//打印log组件
var log = server.create('LOG');//访问redis组件
var redis = server.create('REDIS', {db:'localhost:6379'});//访问http组件
var http = server.create('HTTP', {url:'https://www.baidu.com',header:{aa:1}
});

log组件

在脚本编辑器编写代码会有智能提示,如下图

方法参数说明
info(msg)string记录Info级别日志
warn(msg)string记录Warn级别日志
error(msg)string记录Error级别日志
debug(msg)string记录Debug级别日志

日志采用了开源的LogDashbord 中间件解析Nlog的日志文件

redis组件

在脚本编辑器编写代码会有智能提示,如下图

前提:如上文中已提到,要在appsettings.json里面配置redisconnection连接字符串

方法参数说明
get(key)string根据key从redis里面读取信息
set(key,value,senconds)string,string,int根据key把value设置到redis里面,经过senconds(秒)后失效

一般做服务端渲染的脚本里面讲究的是执行快,不然服务端代码执行很慢,很严重影响用户体验!

是用上面的 产品分享页面 为例:事先根据productId把product的对象记录在redis里面!

db组件

前提:如上文中已提到,要在appsettings.json里面配置db的连接字符串

在脚本编辑器编写代码会有智能提示,如下图

方法参数说明
query(sql)string根据sql从db里面读数据,返回db里row的jsonArry
query(sql,param)string,object根据sql从db里面读数据,返回db里row的jsonArry,和上面的区别是可以指定查询替换符,这样可以防止sql注入
excute(sql)string执行db的 insert,update,delete语句
excute(sql,param)string,object执行db的 insert,update,delete语句,和上面的区别是可以指定查询替换符,这样可以防止sql注入
insertWithIdentity(sql)string执行db的 insert语句 拿到主键
insertWithIdentity(sql,param)string,object执行db的 insert语句 拿到主键,和上面的区别是可以指定查询替换符,这样可以防止sql注入

是用上面的 产品分享页面 为例:假如db里面 有一个product表

脚本可以这么写:

我在实际业务中还这么用过:

先从redis里面取,如果redis没有我就从db里面取了放进redis!这样就比较灵活,而且效率也很高!!

http组件

全局配置功能

全局配置提供一个json编辑器,配置的json信息,可以直接在html 用 @Model.Env.XXX 的方式使用

例如:我上面配置了一个 test :“111”

总结

  • 部署回滚无难事

  • 用db redis http三大组件可以解决大部分SSR场景,不够可以自行扩展其他组件

  • 整体技术栈focus在前端 不需要了解复杂的后端技术

所有代码已托管在github:https://github.com/yuzd/Spa

我是正东,学的越多不知道也越多。今天介绍的这个项目是2020我开源的,核心用到技术有:容器技术,服务端js脚本引擎jnit , html渲染引擎razor,脚本编辑器是亮点当时用了我很多时间研究这个,做出来还是蛮有成就感的!

欢迎白嫖点赞!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301472.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这些Python骚操作,你值得拥有

全世界只有3.14 % 的人关注了数据与算法之美0x00 世界&#xff0c;你好程序员第一次接触语言或者框架&#xff0c;基本上都有个 Hello World 的例子&#xff0c;这里 Python 直接将它做成了一个包。0x01 Python 哲学Python 执行 import this 时&#xff0c;会打印出 Python 之禅…

晨风机器人突破限制_厉害了!工程建设领域首创!会自动测量、自动调平的测量机器人...

近日中建三局工程技术研究院自主研发的道路工程移动式高精度测量机器人在武汉四环线工程完成20余公里测试应用标志着机器人完成阶段性测试具备工程应用条件道路工程移动式高精度测量机器人是一种集自动行驶、自动调平自动设站、自动测量等功能于一身的机器人系统系首次在道路工…

晕了!这个配置值从哪来的?

如果有同事问你&#xff0c;数据库连接串的值和appsettings.json配的不一样&#xff0c;从哪来的&#xff1f;你能回答的出来吗?配置读取顺序ASP.NET Core 中的配置是使用一个或多个配置提供程序执行的&#xff0c;配置提供程序使用各种配置源从键值对读取配置数据。ASP.NET C…

client中周期性边界_「微评」增加艺术品在投资组合中的比例 推进国家艺术软实力...

艺术品作为一种兼具收藏属性和投资属性的物品&#xff0c;其最初被人们所接受的是其收藏属性。在进入二十一世纪后&#xff0c;其投资属性才逐渐显现。艺术品的双重属性增加了其投资价值&#xff0c;再叠加显著的顺周期性&#xff0c;艺术品能够在经济向好时为投资者提供超额收…

面向.NET开发人员的Dapr——分布式世界

面向.NET开发人员的Dapr——前言The world is distributed分布式世界Just ask any cool kid: Modern, distributed systems are in, and monolithic apps are out!随便问一个酷小子&#xff0c;他们都会说&#xff1a;现代、分布式系统时间已经到来&#xff0c;单体应用已经成为…

豆瓣最高评分8.1!万维钢:读懂这本书,你会比身边人更深的理解这个时代

▲数据汪特别推荐点击上图进入玩酷屋小木用真金白银来给大家送礼物啦&#xff0c;特别感谢这些年一直以来大家对我们的支持&#xff0c;才让我们越做越好。&#xff08;点我参与送礼活动&#xff09;这几年全球各大科技巨头纷纷进入人工智能领域&#xff0c;催生了一大批技术的…

camunda流程定义表无数据_[Python04] 学习snakemake,三步轻松搭建生信流程!

随着学习的不断深入&#xff0c;分析的数据越来越多。你会发现&#xff0c;日常生信分析不过是调用一些相同的函数或者包分析不同的数据&#xff0c;换汤不换药。那么&#xff0c;如何把分析过程流程化&#xff0c;让数据像工厂的流水线一样自动被处理&#xff1f;最简单的法子…

基于centos5.8源码安装nginx之LNMP

LNMP 指的是什么呢&#xff0c;这里可以“望文生义”&#xff0c;其是linux NGINX Mysql PHP的组合。每一种工具的安装都有其特长来吸引我们去使用它&#xff0c;对此就要了解其组合的各个工具的特点&#xff1a;Linux&#xff1a;不用多说&#xff0c;这是我们都熟知的以开…

cheatengine找不到数值_“不会找问题”,只配在底层,最高效的思维方式导图,人生开挂!...

点击右上角【关注】&#xff0c;每天获取企业经营管理秘籍&#xff01;总裁周刊&#xff0c;与您一同成长&#xff01;声明&#xff1a;文章来源于zhang_liangj&#xff0c;不代表高管周刊立场&#xff0c;如有异议&#xff0c;请私信&#xff01;文|张良计现在&#xff0c;我们…

比乐高便宜十倍!4合1电动遥控积木玩法百变

▲数据汪特别推荐点击上图进入玩酷屋小木用真金白银来给大家送礼物啦&#xff0c;特别感谢这些年一直以来大家对我们的支持&#xff0c;才让我们越做越好。&#xff08;点我参与送礼活动&#xff09;前几天与同事在聊天&#xff0c;他说小时候的梦想就是拥有很多很多的玩具。没…

python类库32[多线程同步Lock+RLock+Semaphore+Event]

2019独角兽企业重金招聘Python工程师标准>>> 一 多线程同步 由于CPython的python解释器在单线程模式下执行&#xff0c;所以导致python的多线程在很多的时候并不能很好地发挥多核cpu的资源。大部分情况都推荐使用多进程。 python的多线程的同步与其他语言基本相同…

加个ing是什么意思_take的意思竟然是“要求”?奇奇怪怪的熟词僻义打卡终于来了!...

慢慢来&#xff0c;比较快。只要不喊停&#xff0c;我们就继续。考研人被玩坏了&#xff0c;出题人&#xff1a;只要我不承认&#xff0c;就没有人能阻止我。下面盘点一下出题人的x操作&#xff1a;2020年英语二完形&#xff1a;trying&#xff0c;乍一看是不是和“尝试”有关&…

每日一笑 | 今天是植树节,我想在你心里种点逼树

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;

怎么用计算机计算出选手最后得分,WPS技巧:TRIMMEAN函数计算选手得分

如图1就是某大奖赛的选手评分情况表。在“最后得分”一项中&#xff0c;我们可以用LARGE函数或SMALL函数来计算&#xff0c;如在J3中输入下面的公式&#xff1a;AVERAGE(LARGE(B3:I3,{2,3,4,5,6,7}))即可以得到正确的结果。这里&#xff0c;我们介绍ET提供的内部平均值函数——…

Windows 程序包管理器 1.0 正式发布

在 Microsoft Build 2021 开发者大会上&#xff0c;微软正式发布 Windows Package Manager&#xff08;程序包管理器&#xff09;1.0 正式版&#xff0c;目前在 GitHub 上已有超过 1600 个程序包可供下载。Windows 程序包管理器是一个综合的程序包管理器解决方案&#xff0c;由…

围棋天才柯洁怒怼央视国际记者,用实力斩获清华大学免试资格

全世界只有3.14 % 的人关注了数据与算法之美3月10 日&#xff0c;国家体育总局发布了《2019年优秀运动员免试入学推荐名单》&#xff0c;一批在体育领域获得亮眼成就的运动员们&#xff0c;将获得中国各所高校的免试入学机会。在名单上&#xff0c;数据汪找到一个熟悉的名字——…

计算机专业杀毒,计算机病毒查杀

面对计算机病毒日益剧增&#xff0c;普通人的电脑中病毒的几率越来越大&#xff0c;学习几招查杀病毒的方法&#xff0c;有助于保持系统安全运行也避免一些不必要的损失。下面是学习啦小编跟大家分享的是计算机病毒查杀&#xff0c;欢迎大家来阅读学习。计算机病毒查杀步骤/方法…

Azure 上的网站如何识别不同国家和地区的用户

点击上方蓝字关注“汪宇杰博客”导语跨国服务的网站通常需要针对不同国家和地区的用户显示不同的内容。通常我们会根据用户的IP地址识别Ta所在的国家和地区&#xff0c;而自己编写代码以及购买和维护IP数据库&#xff0c;或使用三方的IP数据服务&#xff0c;是潜在的996成本。虽…

中小学不得在校内设置食品经营场所,量子摩尔定律问世,美团运营摩拜亏45亿,英伟达史上最大手笔收购,这就是今天的大新闻。...

今天是3月12日农历二月初六今天星期二去吃饭老板问要饭的吗一兄弟说我要饭的我要饭怎么觉得这对话有点怪怪下面是今天的大新闻中小学不得在校内设置食品经营场所&#xff08;中国新闻网&#xff09;据教育部网站消息&#xff0c;由教育部、国家市场监督管理总局、国家卫生健康委…

轮廓处理函数详细

ApproxChains用多边形曲线逼近 Freeman 链 CvSeq* cvApproxChains( CvSeq* src_seq, CvMemStorage* storage, int methodCV_CHAIN_APPROX_SIMPLE, double parameter0, int minimal_perimeter0, int recursive0 ); src_seq涉及其它链的链指针storage存储多边形线段位置的缓存m…