关于全栈:做好这四步服务端轻松成为全栈化人才

软件开发里本没有服务端,分的细了就有了服务端。做为一个软件开发者,每个人都能够是全栈。看到“服务端全栈”这个词,不晓得屏幕前的你当初脑子里想到的是什么问题。 老板:咱们团队的服务端能够去写前端么?会不会搞出很多故障?能不能缩短开发工夫?能不能给我节省成本?前端:你都能写前端了,那还要我干嘛?服务端:我有必要学前端么?写前端对我职业生涯有啥益处?学到啥水平能够写前端需要,公布前端的利用?我第一次晓得这个词的时候,脑子里是一片空白的状态:老板把我叫到茶水间,理解了一下前端教训、排期状况,选了我去做“服务端全栈化”。具体就是有个我的项目前端缺人手,我的项目中曾经有个前端大佬,让我去打打辅助。 过后的我只在flask我的项目写过简略的html,三大前端框架都不会,满心欢喜的筹备去我的项目室抱大腿学前端。等我到了我的项目室发现,带我的前端大佬是日理万机的前端大团队TL,我也不太好意思让大佬陪着我写代码,我就变成了我的项目里惟一一个前端开发,大家都叫我团队的希(瓶)望(颈)。 从那天开始,我白天强装镇定在我的项目室写前端,深夜疯狂补课、学习前端常识,解决白天遇到的问题。过程中好在前端TL很给力,帮忙找了很多资源解决我开发中遇到的问题,就这样磕磕绊绊继续了一个多月,我的项目终于上线了。这也成了我的全栈化初体验。 在尔后的一年中,我在没有耽搁服务端成长的状况下,从一个须要前端帮助的全栈开发,成长为了独当一面、能够牵头整个模块级的前后端系分设计、辅导其余服务端同学进行前端开发、把控前端我的项目品质、上线前端我的项目的全栈化同学。 作为团队的全栈化标杆同学,和咱们团队惟一的前端同学一起,在老板的鼎力支持下,走出了一套可复制可迁徙的服务端团队全栈化路线,团队里年老的服务端开发同学都具肯定的全栈能力,团队的前端资源不再成为瓶颈。 在我和咱们团队其他同学的全栈化实际中,我留神到每个阶段都有一些共性的痛点和问题,也有一些本人的解决思路和教训,心愿分享进去让前人能够更轻松退出全栈化小家庭,走的更快更稳。 第一步:从入门到不放弃——前端根底学习在入门阶段,咱们须要解决以下几个问题: 前端常识去哪学,怎么学?学到啥水平能够入手?看完我认为我会了,一入手写憋不出两行代码。语言问题、开源框架的问题能够问chatGPT,外部框架、工具的问题没有脉络。简略的画页面和逻辑终于能够写了,一遇到环境问题或者疑难杂症就只能求助或绕过。Tip1 系统性疾速学习,理解技术幅员,开发过程中扣细节不晓得大家在大学的考试周,有没有过“一夜一门课,两周一学期”的体验。我作为一个长期抱佛脚选手,对这一点深有体会。这种学习习惯自身并不值得提倡,然而其中的一些学习技巧能够提炼进去迁徙使用。 工作中的学习,很少可能有让人齐全筹备好再上的机会,往往也是相似考试周的这种系统性疾速学习+突击性具体学习的组合。系统性的疾速学习能够在整个常识体系中,画出一张地图;突击性的学习可能让地图上具体的一小块更清晰。有了地图和一直的突击,就能够更快把常识连成面,造成本人的常识体系。 以钉钉的前端常识体系为例,咱们团队的前端同学曾经给大家梳理了一份前端知识点大图,这个大图解决了从0到1学什么的问题,它就像前文里说的地图,有了这个地图,就有了前端常识陆地里的导航,要做的就是摸索和欠缺这个地图。 对于看视频还是看书学习,不同人的习惯各不相同,我倡议抉择适宜本人的就好,相干的材料也十分好找,不论是阿里外部的奇点学堂,还是内部的B站、油管、以及各种常识付费App,都有很多优良的学习材料。 比学习知识点更重要的是实际。在全栈化初期,我的前端能力之所以能疾速成长,离不开前文提到的那段我的项目里白天写bug,早晨边学边修bug的经验。例如学完React的hook,立即用hook重写一下本人之前的Class组件;学完高阶函数,立即用高阶函数去重构一段适配器逻辑。我并不激励炫技式的应用一些组件或个性,然而如果一个新知识点能够让咱们的代码从中受害,我肯定会去尝试。 Tip2 不要放过任何一个疑难杂症或者顺当的中央在入门阶段,我经常出现本人写了一段烂代码而不自知的状况,不过很快我有了感知这类烂代码的技巧:当一段逻辑,本人都感觉写的不棘手或顺当的时候,往往意味着有更好的解决方案。这时应该记下来,尽快查找、求教,寻取更好的实现形式,并对知识点查漏补缺。 上面这段代码我本人第一次用React实现一个带有筛选器的、反对分页加载更多的表格。直观看,就是有很多个state,并且state之间不是正交的。 const TableBizComponent: React.FC<ITableBizComponentProps> = (props) => {const {dataId, corpId, yearMonth} = props; // 年月筛选和数据id从props传入const [pageNo, setPageNo] = useState(1); // 页号初始化const [selectedFilterId, setSelectedFilterId] = useState(null); // 筛选器选中idconst [filterData, setFilterData] = useState(null); // 筛选器数据const [columns, setColumns] = useState([]); // table表头const [data, setData] = useState([]); // table 全副数据行const [hasMore, setHasMore] = useState(true); // 是否更多 初始化const [needUpdate, setNeedUpdate] = useState(false); // 是否须要调用loadMoreconst [isLoading, setIsLoading] = useState(null); // 页面级加载中const [isPageLoading, setIsPageLoading] = useState(false); // 分页加载中// 初始化数据useEffect(() => {// ...}, []);// 页面切换useEffect(() => {// ...})}没有React根底,我形象的解释一下上述代码的问题:当初有10个开关,管制一个页面的渲染,这些开关并不是独立的,可能开了A开关,C开关也跟着开了;敞开了B开关,D,E开关也动了。这就导致一个简略的用户交互,我须要慌手慌脚的操控这些开关,让他们奥妙的配合,达到正确渲染页面的目标。 ...

September 21, 2023 · 2 min · jiezi

关于全栈:什么是更适合政企的云|从传统-IT-容灾转向全栈云容灾

凌晨3点,在某医院的自助缴费机前,一位医患家属正愁眉紧锁,手中的医保卡曾经刷了无数遍,可次次都提醒缴费失败,至亲的手术曾经火烧眉毛… 早上8点,是上班族在通勤途中关上新闻app刷新闻的顶峰,而此刻在新闻编辑室内,后盾编辑正焦头烂额,零碎上当日热点大新闻的公布界面一遍遍显示“公布失败”… 这些画面几乎是企业IT管理者心中的“劫难大片”,而导致这些问题的起因可能是企业数据中心中某个机柜断电、某次台风导致机房故障、某位IT管理员一不小心删除了数据库… 天下大乱或者难以避免,然而上述场景却能够通过IT架构设计来躲避预防。在云计算时代,面对黑天鹅事件,IT人员如何利用容灾计划来保障业务连续性?云平台的容灾和传统IT容灾到底有哪些不同?哪些因素影响着政企云平台的容灾设计?阿里云又有怎么的解决方案?这篇文章,将一一给出答案。 一 数智时代的双刃剑 —— 云计算的遍及让容灾课题变得更为紧迫随着全行业的数智化转型不断深入,云原生利用曾经成为各界公认的数字化转型范式,而承载云原生利用的底座 —— 全栈云计算平台,则成为政企数智化转型的松软底座。 云计算自身具备的“集约化建设、对立大资源池、对立服务供应”的模式,让利用人造在云平台上大量会集,一方面开释出平台资源弹性供应和麻利调配的劣势,另一方面也意味着一旦平台呈现故障,影响范畴会更大。为了保障业务层面连续性,云平台高可用能力成为当初政企IT掌舵者所关注的重中之重。 尽管云平台在设计之初,曾经具备了初步的高可用能力,诸如组件多正本、数据跨服务器机柜、网络机架打散等,但这只能做到“单机房高可用”。对于金融、税务、医保、能源等行业来说,他们对于零碎的业务连续性有更高的要求。比方金融行业有明确的跨机房容灾政策要求,且外围业务系统故障达30分钟则须要上报下级监管单位;国家、省级医保信息系统必须采纳同城容灾模式来满足业务连续性要求。因而,基于全栈云产品的跨机房容灾成为了局部政企客户的强需要。 二 新瓶为何不能装旧酒?—— 传统IT容灾技术在云时代面临的窘境传统IT容灾通过多年的积淀,目前有两种常见的技术路线: 1.存储级容灾 这种技术次要以传统的阵列存储为主,在两个机房搁置雷同的存储机型,通过阵列间的“同步复制”或“异步复制”等模式,实现数据在双核心的同步。 典型存储级容灾示意图 在该模式下,为了防止数据双写,备核心的计算节点及利用日常处于停机状态,即处于“冷备”。这就意味着,当一个数据中心产生故障后,须要先切换到备核心的IT设施,而后再一一启动备核心的计算节点和应用程序,后果必然带来较长的RTO。另外,该模式下还存在着利用无奈失常启动的可能性,进一步缩短RTO。 随着云原生的倒退利用,业务利用个别会被扩散到动辄数百甚至数千个节点,对如此规模的节点和利用进行重新启动,RTO必然会被大幅拉长,也无奈满足最根本的复原工夫要求。另外,传统阵列在扩展性、老本等维度也不满足云计算的根本技术架构要求。 2.产品级容灾 这种技术的特点是产品本身可实现“工作节点的跨机房转移和数据跨机房的复制”,不依赖于底层存储。对外服务层面,个别采纳主备、双活等模式。数据层面,产品通过本身的机制实现跨机房数据复制,如Mysql的binLog复制等。 典型数据库容灾复制架构 因为备机房产品也是失常的工作节点,只是日常角色为备,不承受流量。当主机房实现切换后,备机房节点立即可用。因而,不会存在切换到备核心后实例不可用的异常情况,业务的RTO个别要小于存储级容灾架构。 从整个业务维度来看,该模式相比存储级容灾的可控水平更高、RTO更好。但该技术只负责利用的某一层技术栈如DB,不足全局业务视角的业务容灾能力。 在云原生条件下,利用会基于IaaS、中间件、数据库、大数据等全栈云产品进行构建,数据也扩散在大量不同的产品,容灾架构也必须基于全栈产品视角,进行端到端的从新设计。 三 给云上掌舵者的考题 —— 全栈云容灾考量公式基于上述剖析,传统IT技术架构难以满足云原生的业务模式,这时就须要全栈云容灾解决方案退场了。作为IT管理者,全栈云容灾是一个全新的简单命题,又有哪些问题须要思考呢?这里引入一个公式帮忙IT掌舵者来进行评估判断: 全栈云容灾复杂度 =(产品数量 X 产品依赖 X 切换场景X容灾指标)/ 容灾治理体验 1.产品数量多 一个业务零碎须要应用十几个甚至几十个云产品,业务牵涉到的所有云产品及撑持产品都须要具备容灾切换能力。同时,数据存储类型相比传统IT大大增加,常见如块存储、对象存储、OLTP数据存储、OLAP数据存储、离线大数据存储、日志存储等。为了达到跨机房容灾成果,在抉择云平台时,IT管理者须要确保这些产品均要具备“跨机房数据同步”和“跨机房高可用”的能力。 某阿里云客户所应用的次要云产品统计 2.产品依赖多 为了实现云产品的高可用,升高产品的反复开销,云平台在设计时,个别会将产品组件和依赖组件进行拆分,如把DNS、NTP、元数据库、分布式协调服务等作为底座组件来对立对下层云产品提供服务。因而,容灾切换须要思考到底座及产品依赖,防止产品切换后,因为短少依赖而导致报错或无奈应用。 3.容灾场景多 跨机房故障场景类型较多,每种产品都须要同时思考“机房断电、脑裂、网络中断、故障回切”等多种场景下的数据复制策略和切换预案,以最快的速度实现业务复原和保障数据安全。 4.容灾要求高 云时代的业务故障影响面更大,容灾相比传统IT架构须要更高的RTO和RPO要求。如中国人民银行公布的《云计算技术金融利用标准容灾》中对于RTO和RPO的具体要求如下: 5.容灾治理体验 鉴于上述的“三多一高”问题,全栈云的容灾治理也成为一个难题,容灾治理最好能具备如下能力: a) 简略切换:一次容灾切换可能同时牵涉到几十款产品的容灾协同,无奈再通过传统手工的形式一一执行产品切换,因而云平台必须具备高效的演练和切换能力,升高RTO。b) 全场景笼罩:容灾设计须要兼顾同城、异地、两地三核心等多种容灾场景,且可随着政企容灾架构的演进在各场景继续进行迭代。c) 租户隔离:在多租户场景中(云平台须要对外提供经营和服务),须要反对各租户进行自助容灾,同时单个客户不同零碎能够按需进行切换,且保障容灾切换对其余客户的业务无影响。d) 可控容灾:云平台须要具备欠缺的容灾监控体系,用户可随时把握最新容灾动静,并与外部的容灾预案流程相结合,确保零碎时刻处于“可控、可预知”的状态,防止“非预期切换”造成的数据安全危险。 四 更强实力更有底气 —— 阿里云是全栈专有云容灾的开创者从上述全栈云容灾的特点和需要来看,全栈云容灾考验的是云厂家对全栈产品的掌控和驾驭能力,须要对所有产品具备代码级的架构批改和性能迭代能力,以及欠缺的产品工具支撑体系。唯有如此,能力提供成熟、稳固、可迭代的容灾服务能力。这也正是阿里云全栈自研的劣势所在。 阿里云于2015年推出飞天企业版,采纳与公共云同样的技术架构,为政企客户提供全栈产品服务能力。在帮忙客户实现“建云”“上云”过程后,基于客户广泛的高业务连续性要求,阿里云在业内率先进行基于专有云的跨机房容灾研发。通过宽泛的用户需要调研,阿里云“采纳利用级容灾思路、基于全栈产品视角,以利用端到端复原为出发点”,于2017年正式推出飞天企业版容灾解决方案,在业内创始了全栈专有云容灾的新范式。 通过多年技术迭代,飞天企业版容灾解决方案的能力不断加强: 2017年,反对同城双AZ容灾,反对20+云产品容灾;2018年,在金融、政务等多个客户实现同城容灾我的项目交付,具备生产级容灾能力;2019年,反对异地跨云容灾、异地多活容灾,并在多个政务客户实现交付;2020年,反对同城3AZ容灾,业内率先实现了基于云原生条件下的数据库RPO=0,多个银行客户进入3AZ容灾阶段;反对多对一异地容灾,反对了某省医保“省级同城容灾、省市间多对一异地容灾”建设模式;2021年,反对全栈产品级的两地三核心容灾,满足金融等行业同时具备同城、异地容灾的政策要求;2022年,反对基于国产化芯片的容灾能力,各场景下的容灾能力失去大幅晋升,满足了政府、金融客户在一云多芯的需要下的容灾状态要求。基于全栈云容灾的需要,阿里云飞天企业版容灾解决方案构建起“多边形兵士”的能力: 1.反对产品最多 飞天企业版已实现IaaS、中间件、数据库、大数据、底座等全栈60+ 产品在不同场景下的容灾架构设计,能够满足不同行业客户应用层端到端容灾的需要。 2.反对场景最全 鉴于客户不同的容灾模式需要,飞天企业版反对同城双AZ、同城三AZ、异地跨云容灾、异地跨Region容灾、异地多活容灾、异地多对一容灾、两地三核心容灾等多种原子容灾场景,能够基于不同业务特点,将上述原子容灾场景进行排列组合,造成更简单的组合容灾场景,如“同城容灾+异地多活”、“同城容灾+异地多对一容灾”等模式,具备“全场景容灾”的能力。 ...

May 26, 2023 · 1 min · jiezi

关于全栈:一文讲透CabloyJS全栈框架的来龙去脉

本文受众咱们做软件开发,就好比是建造一幢幢屋宇,一座座桥梁,既能够是南方宫殿的巍峨,也能够有北方庭院的雅致,更能够是横跨群山的峻险与孤悬。那么,不同的语言、不同的框架也都由其内在的秉质吸引着一批粉丝,坚定不移的耕耘,营造出不同的生态,呈现出不同的开发格调和开发体验。正如Rails之于Ruby,Lavaral之于PHP,Django之于Python,Spring Boot之于Java。那么,又是什么之于Javascript呢?毋庸置疑,Javascript面对着更多的应用场景,前端、后端、挪动端、IOT,等等。不同的场景都有杰出的解决方案存在。而且,基于不同的应用偏好,又决裂出Javascript和Typescript两个格调体系。那么,基于业务开发而言,就目前的Node生态能够说,Nest之于Typescript,Cabloy之于Javascript 正因为面对业务开发,不同的语言、不同的框架,会有不同的解决方案和格调体验。因而,不管您应用CabloyJS或者不应用CabloyJS,都有必要进来看看在坚守原生Javascript(Vanilla JS)的土壤上,能够开出怎么的花朵。因而,不管您是前端开发、后端开发、全栈开发,或者其余语言的粉丝,或者技术经理、产品经理、项目经理,都能够从CabloyJS提供的文档和视频中吸取不一样的解题思路和办法,互相交换,互相借鉴,共同进步! 在英语语境中,原生Javascript有一个专属名称:Vanilla JS。而Vanilla有香草之意,看来所言不虚语言框架RubyRailsPHPLavaralPythonDjangoJavaSpring BootTypescriptNestJavascriptCabloyCabloyJS是什么CabloyJS 是一款自带工作流引擎的 Node.js 全栈框架,一款面向开发者的低代码开发平台,更是一款兼具低代码的开箱即用和业余代码的灵便定制的 PAAS 平台。只需一套代码,即可同时实现中后盾管理系统和前台利用。只需一套代码,即可同时跨端pc和mobile,并且mobile端是靠近原生体验 CabloyJS 内置的每一项个性都做到精心调校,均体现了从开箱即用到灵便定制的无缝连接,包含:角色零碎、用户认证、菜单权限、数据权限、表单渲染、表单验证、工作流引擎、字典、仪表板、在线推送、页面主题、多语言国际化、CMS 渲染引擎、微信接口、企业微信接口、钉钉接口,等等 技术栈场景技术栈前端vue2 + framework7后端koa2 + egg2数据库mysql分布式(缓存/队列/音讯)redis、bullmq、websocketMarkdown 富文本编辑Prosemirror在线演示CabloyJS提供了大量在线演示: 演示如何在一套代码中同时开发B端中后盾管理系统和C端前台利用演示如何在一套代码中同时跨端pc和mobile,并且mobile端是靠近原生体验因而,强烈建议您移步查看:在线演示 引言但凡能够用 JavaScript 来写的利用,最终都会用 JavaScript 来写 | Atwood 定律目前市面上呈现的大多数与 NodeJS 相干的框架,根本都将 NodeJS 定位在工具层、聚合层、中间层、代理层,很少在业务层面进行深耕,认为这是 JAVA 的畛域,NodeJS 不适宜。这种思潮显著是与Atwood 定律相悖的 如果您想感触不同的 NodeJS 全栈开发体验,肯定要试试自带工作流引擎的 CabloyJS 全栈开源框架。为了晋升业务层面的开发效率和开发体验,CabloyJS 在前端和后端均提供了大量实用的工具和组件 CabloyJS 解决了哪些事实痛点问题?在 NodeJS 开发畛域,目前(截止 2022 年 11 月)存在以下几个痛点问题: 1. 中后盾管理系统如何更优雅的反对挪动端?随着挪动终端的遍及和升级换代,大量业务场景都须要挪动端的反对,比方管理层须要通过手机查看统计数据、审核业务单据;运维人员通过手机近程查看服务器状态,并进行调整优化 咱们晓得,市面上大多数中后盾管理系统,都是优先适配 PC 端,然而挪动端体验却不佳,处于勉强可用,但不好用的阶段 此外,大多数XXX Admin框架和中后盾治理框架其本质是代码模版。在具体开发我的项目时,间接在代码模版中编写代码。这样,尽管批改起来很间接,然而不利于模版的继续降级和优化;也不利于业务代码的继续积淀和迁徙(至其余我的项目)。因而,当把代码模版从源码仓库下载下来之后,批改三分之一,减少三分之一,删减三分之一,从此就与代码模版的后续降级版本绝缘了 2. NodeJS 畛域没有好用的工作流引擎!如果单说 CRUD,大多数编程语言的开发框架都能够轻松实现,这不应该成为 NodeJS 开发业务零碎的外围劣势。若要让 NodeJS 深刻业务畛域的开发,工作流引擎是一个绕不过来的外围组件 3. 拖拽式低代码平台曾经成为鸡肋计划!大多数业务表单不仅仅是一些字段的简略组合和增删改查,不同的业务都有本人独特的业务诉求,往往须要前端界面的定制和后端逻辑的定制。拖拽式低代码平台,对于业务人员而言没有足够的工具进行深刻定制,对于研发人员而言也没有足够的机制深刻开发 ...

November 23, 2022 · 1 min · jiezi

关于全栈:vue下载excel以及自适应表格宽度前后端

本文应用 SpringBoot + vue + easyExcel 实现导出 Excel 性能,并解决文件中文乱码问题以及 Excel 宽度自适应的问题。须要先导入 pom 包。 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId></dependency>easyExcel 开源地址:https://github.com/alibaba/ea... 1 excel 文件下载vue中下载excel流文件及设置下载文件名:https://segmentfault.com/a/11... 应用 vue-json-excel 控件: https://www.npmjs.com/package... 形式一: 人为结构 a 标签,主动点击。 PS:留神,文件名称,不能通过上述链接中的 this.filename 获取到。 axios .get(`/api/audit/export`, { responseType: "blob" //服务器响应的数据类型,能够是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream',默认是'json' }) .then((res) => { if (!res) return; const blob = new Blob([res.data], { type: "application/vnd.ms-excel" }); // 结构一个blob对象来解决数据,并设置文件类型 if (window.navigator.msSaveOrOpenBlob) { //兼容IE10 navigator.msSaveBlob(blob, this.filename); } else { const href = URL.createObjectURL(blob); //创立新的URL示意指定的blob对象 const a = document.createElement("a"); //创立a标签 a.style.display = "none"; a.href = href; // 指定下载链接 a.download = "test.xlsx"; //指定下载文件名 a.click(); //触发下载 URL.revokeObjectURL(a.href); //开释URL对象 } // 这里也能够不创立a链接,间接window.open(href)也能下载 }) .catch((err) => { console.log(err); });形式二: ...

August 22, 2022 · 2 min · jiezi

关于全栈:全栈云原生的数据分析时代已来我们如何抓住机会

据 Gartner 2022 年最新趋势剖析,数据分析将成为翻新起源与企业外围能力,数据越来越重要了。在更早前 IDC 和数据存储公司希捷的报告示意,我国产生的数据量从 2019 年的约 9.4ZB 将猛增至 2025 年的 48.6ZB。当初,数据工程师须要面对更加繁冗和宏大的数据、离线场景/实时场景/流式场景等泛滥不同的剖析场景、多个数据库技术栈并存和与之对应的存储计算成本,很多公司的数据团队往往会被这些海量数据与各类底层集群、基础设施的要求所吞没。 如何降本增效,买通数据分析与存储,进步数据分析的灵活性,同时升高底层资源的运维老本,成为了令技术团队头疼的问题。 智能湖仓,数据分析的下一站已到来这个时代,驾驭数据的能力是所有决策者“技能清单”里最重要的一项。历史通知咱们,无论哪个行业,率先在行业中把握新工具“利器”是如许重要。 最早的传统型、老式的纯数据仓库曾经不合适半 / 非结构化数据的解决;而单纯的数据湖尽管适宜存储数据,但不反对事务处理,不保证数据品质,并且不足一致性与隔离性。 站在数据价值进口的角度来看,只有各类数据价值平台全面落地利用,大数据的潜能才会被进一步开释。为了实现数据湖和数据仓库之间的无缝流转,买通数据存储和计算的不同的层面,兼顾数据湖的灵活性和数据仓库的成长性,促成企业更无效的工具利用,像亚马逊云科技就提出了“智能湖仓”架构,帮忙企业客户放慢大数据价值实现过程。 以翻新技术厂商亚马逊云科技为例,2020 年在亚马逊云科技 re:Invent 大会上,亚马逊云科技针对数据分析等相干服务推出了“智能湖仓”架构,不过早在 2017 年,亚马逊就公布了 Amazon Redshift Spectrum,该性能使得 Amazon Redshift 在过后就具备了买通数据湖和数据仓库的能力,实现跨数据湖、数据仓库的数据查问。此外,在 2021 年 re:Invent 大会上,亚马逊云科技更进一步,在存算拆散架构根底上,推出更多数据分析服务的无服务器(Severless)版。 当初,无服务器架构(以 2014 年推出的 Amazon Lambda 为代表)曾经是云原生中最热门的技术类别。无服务器应用程序是由事件驱动的,并通过与技术无关的 API 或音讯收发进行涣散耦合,能够让开发者更关注于构建产品中的利用,而不须要治理和保护底层堆栈。当初,数据分析服务借助无服务器的能力,能够让用户更便捷地构建数据存储、剖析、智能利用解决方案,彻底实现无服务器的数据分析服务,实现底层庞杂数据的高效解决、流转与共享。 可能达到这样的技术水平和高度,离不开工夫的积淀和技术的积攒。想要深刻理解“智能湖仓”,就须要理解它的过来与当初。咱们能看到,亚马逊云科技所推出的无服务器数据分析服务,经验了几个阶段: (1)2006 年,亚马逊云科技正式推出 Amazon S3,其作为亚马逊第一个云产品,提供了多种经济高效的存储类和易于应用的治理性能,从而满足特定的业务、组织和合规性要求。现在“智能湖仓”就是基于 Amazon S3 构建数据湖,绕湖集成数据仓库、大数据处理、日志剖析、机器学习等数据服务。Amazon S3 数据湖的可靠性和大容量的数据存储能力,是确保整个“智能湖仓”架构无效利用的根底。对于软件开发人员来说,当初曾经是无服务器架构的 Amazon S3 能够很低的老本提供可扩大、牢靠且提早低的数据存储基础设施,让开发人员利用云计算的规模劣势,以极低的后期资源投入换取稳固的数据基础设施,非常适合进行疾速技术创新。 (2)Amazon Athena 是一种无服务器的交互式查问服务,用户可能轻松应用规范 SQL 剖析 Amazon S3 中的数据。无需 ETL ,具备 SQL 技能的任何人都能够轻松疾速地剖析数据湖中的大规模数据集,这对技术人员的生产力是一种解放!当咱们想应用 SQL 间接进行数据湖上的剖析且不想治理任何集群时,Athena 无疑是一个麻利且疾速开始的抉择。 ...

May 26, 2022 · 1 min · jiezi

关于全栈:用个人博客打造一个酷酷的工作流

博客地址 替换友链ing写在后面每个前端都应该领有一个本人的博客、因为它不仅仅是一个博客、更是属于本人的一个工作流、如何来了解这个问题呢、这也就是我要开发一个博客的初衷。 仿佛本人也没有一个写博客的习惯、或者说感觉写得一些笔记还达不到能够公布在相似掘金这样的技术平台、然而又会在日常中用到、例如记录的一些文档或者日常、平时会保留在本地或者一些云文档下面、然而不够清晰、也会有些不不便、而且在很多种场景之下会有局限性、于是我便有了打造一个本人集体博客的想法。 往年貌似也没有做太多的货色、唯独很多人通过掘金来加到我问我要博客的源码、所以来为大家分享下本人空闲工夫开发这个博客的经验。 往年的年终总结看来没工夫写了、就来一篇分享完结往年的分享吧。 动态博客最开始的时候、为了疾速去打造一个集体的博客、我抉择过一些动态网站生成器类型的网站、例如hexo、vuepress、这类框架、这类博客的益处就是快、很多相似这种博客的搭建题目通常是五分钟打造一个xxxx等这样的题目、显然、这是劣势、然而在很多场景之下、因为它是动态的、一些交互就不好做了、例如、文章评论、登录注册、用户交互这些不便很难实现的很灵便、尽管能够接入一些三方的插件来实现这些性能、然而都不能防止的是、他只是一个动态博客、例如发文章这种操作都必须更新重新部署、显得尤其不太不便、更多时候像vuepress我感觉拿来做技术文档更为不便、hexo的益处就是社区有很大一部分维护者、当然业开发了api能够让你本人打造一个主题或者援用他人的主题、可能做到很炫酷、这对初学者尤其无利、给初学者了一个很好的平台、这也是我当初很赶趣味的起因、当曾经有能力去开发一个集体的博客的时候、我感觉作为一名前端开发工程师为本人打造一个集体的全栈博客很有必要。 博客是干嘛的?这个问题我感觉畅所欲言,很多人感觉博客这货色就很童稚、也感觉齐全没必要本人破费精力去开发一个本人的博客、感觉当初各种云平台足够不便、我觉的这样的想法也没什么问题、然而也有很多人感觉打造一个集体博客是有用的、可能有一个记录本人的平台、齐全由本人掌控、想实现任何性能都靠本人就能够齐全实现、这一点就足够有吸引力、但我感觉益处不仅仅于此、博客除了和云平台一样记录本人博客之外 使用本人的所学从0开发能够锤炼你的技术广度、而不是日常工作反复做做本人的产品能够有本人的思维、从设计ui到性能交互你一个人说了算、你能更全面的理解一个产品的生命周期和流程以及须要思考的问题能够打造一个属于本人的工作流、这一点至关重要、如何了解呢?咱们前面聊聊后期筹备作为一个属于本人的我的项目而言呢、首先要构思出本人须要做出一个什么样的货色、以及你要做到什么水平、当然最重要的是你得晓得本人为什么做、有什么用、能干什么。 作为一个前端工程师、咱们在需要下来后须要去和UI设计师打交道、所以呢咱们须要去画一个原型图、这里呢举荐大家应用process这个平台集体用了很久、在线能够做出你须要的货色也能够分享给别人一起应用,所以绝对还是很简略的、这一点很多人可能感觉很难、其实不然、作为前端工程师天天和这些打交道、这个时候平时对设计师的不满本人都能够实现了、而且咱们不须要设计的过于简单、一个原型图就是一个前端的根底布局框架、想给本人的门面打造成什么样子呢?这个由你决定、比方惯例的两栏布局、三栏布局、双飞翼布局等等、有了这样一个构造你就能够自由发挥了、UI这一点呢还是挺难的、对于前端来说咱们能够优雅的剽窃一下、作为文化人、咱们就是说借鉴一下对吧、毕竟好多时候大家都说、设计师的工作不就是抄来抄去么(手动狗头)! 技术选型有个原型之后就是技术选型了,这一点呢就得因人而异了、毕竟每个人的技术栈是不同的。作为一个博客我的项目、我思考到前期会做其余的迭代可能会加很多货色、于是我决定把它分为三局部来做。 前台显示页面:博客展现页、对外输入的页面、这里是给他人看的后盾管理系统:这个用于治理博客、当然这个治理后盾能够多个通用后端我的项目开发:用于API接口的提供开发、提供博客须要的能力前台页面技术栈应用的nuxt[一个vue的服务端渲染框架]、之所以要用nuxt是因为vue或者react这种单页面的我的项目无奈被百度蜘蛛爬取到、也就没有了收录、所以抉择了服务端渲染。 后盾管理系统应用了vue3开、vue3曾经进去很久了、公司上没有应用上、集体我的项目当然能够来尝尝鲜了、这里呢我感觉后盾管理系统无关紧要、对于每个前端开发都应该是驾轻就熟了。 后端这块儿当然是抉择前端最容易上手的NodeJs了、这块儿货色置信大家都会了、框架选用了NestJs这个框架也是刚刚接触、然而在Github下面我的项目十分炽热、所以抉择了这个框架。 部署这块儿呢应用了docker+gitlab这一套比拟常见的体系、因为集体我的项目为了不便本人治理和部署、也是搭建了本人的公有Gitlab。 我的项目构造当咱们曾经思考完技术栈之后、咱们就要在大脑构思我的项目的整顿底层设计交互了,这个货色咱们通常须要一个思维导图来画进去了、这里仍然举荐process这个工具很全、能够画很多货色、根本能用到的都有。 举荐process 注册地址在初期、咱们不用把我的项目想的过于简单、咱们能够尽量拆离开性能、做到第一层就好、晓得须要做个什么货色、而不用深究咱们能不能实现、须要用什么技术栈等等。 初期有了这个思维导图咱们就发现如同清晰了很多、做什么、怎么做、是不是就有高深莫测的感觉了、当然这个也不是一下就能想到的、集体倡议呢就是在睡前这个工夫点去思考本人做一个什么货色、闭上双眼的时候能够想的更加清晰、效率也更高、我也习惯在每天晚上睡前去想想第二天的工作安顿实现思路、一些理分明也就自然而然睡着了、第二天也会事倍功半了。 我的项目开发程序这一点我感觉大多数人可能也不大一样、这里只是分享一个集体的观点、日常来说、如果你是前端、其实个别节奏会晚于后端。 一个是思考到接口的对接会当前端为准、后端给到了咱们能力对接二是当咱们不接触到后端的时候没方法只能等到后端实现能力去做当你本人全栈的时候、程序就由你来掌控、你能够顺叙来干、前端写完了再去做后端都能够、因为字段都是你来定义、交互也是你设计的、这所有你都了然于心。 但我集体习惯的是同时开发、前端比照于后端的乐趣其中一点在于所见即所得写的代码能够马上失去反馈、有种把握之中的感觉、这也是比照后端而言高兴的一点、集体感觉同时开发的益处在于联调谬误会很快、亦或是讲出了一个流程谬误、我能够两边同时更改、这一点感觉体验蛮好、同时开启两个我的项目、也不会有太多问题、当然这里实则有些废话了、每个人的开发习惯不同、全看本人了。 进入开发进入开发之后的场景就回到了咱们所相熟的畛域、就是日常接需要开发需要、置信大家如果到了这步都会得心应手了、到了这里呢咱们开始进入开发、绝对于技术来讲、集体的技术还是绝对肤浅不能给大家很好的技术领导、更多的是想分享一下集体的我的项目经验而已、心愿大家手下留情。 这里就集体博客的一些开发提供一点思路和一些开发过程中遇到的坑、心愿大家遇到的时候能够少一些坑趟、仅此而已。 前台页面开发框架 : nuxt要开发一个残缺的我的项目所需的小的技术点还是很多的、咱们就不一一列举了、咱们就开发思路而言来说说要做的事件 我的项目目录 .├── Dockerfile                          *docker部署配置├── README.md *我的项目阐明文档├── app.html *主页├── assets *动态资源├── components│   ├── base *根底组件封装│   ├── chat *聊天室组件封装│   ├── kit *根底组件配套组件│   ├── layout *布局组件│   └── page *页面级别组件├── configs│   ├── env.development.js *测试环境配置文件│   ├── env.production.js *生产环境配置文件│   ├── index.js *配置文件导出│   └── sitemap.js *网站地图├── layouts│   ├── chat.vue *聊天室布局│   ├── default.vue *默认布局│   └── error.vue *谬误页面布局├── nuxt.config.js *全局配置文件├── package.json├── pages *页面开发├── plugins│   ├── api-repositories.js *Api接口封装│   ├── axios.js *axios全局申请│   ├── baidu.js *百度统计│   ├── directive *各种指令封装│   ├── element-ui.js *element-ui引入│   ├── format.js *全局工夫格式化办法│   ├── socket.js *socket-io│   ├── storeCache.js                   *store仓库本地缓存│   └── svgIcon.js *全局svg图标注册├── server│   ├── index.js *我的项目启动文件│   └── pm2.config.json *pm2启动配置├── static *favicon robots等文件├── store *vuex├── gitlab-ci.yml  *gitlab-ci 配置文件└── stylelint.config.jsnuxt框架的语法沿用了vue、然而也会在一些中央稍有不同、这里为大家总结一些不便大家更快动手。 ...

January 14, 2022 · 2 min · jiezi

关于全栈:关于为了吃瓜通宵7天写了一个网站却没钱买域名这件小事

我不做猹了,闰土!我记得那夜的月亮很亮,很圆。 漫天星河,横挂在无际的瓜田之上。 我捧着手里的瓜,细细地品尝着,丰满多汁的瓜瓤在味蕾流淌。 晚风轻柔,远处有着不出名的虫儿哼着不出名的调调。 如此良夜,我甚至想高歌一曲。 突然,一柄银色的钢叉向我袭来,吓得我汗毛倒立,差点没被口中的瓜瓤呛到。 我想拔腿就跑,然而我晓得曾经来不及了。 我侧面迎向了眼前的少年,大略也算是勇敢的姿势吧。 银色的钢叉从我的身材穿过,我感到有什么货色在流淌。 已经我认为只有我吃瓜的速度足够快,钢叉就追不上我。 我越是晋升吃瓜的速度,越是发现猹是有极限的,我不做猹了,闰土! 我有力地横躺在瓜田之上,慢慢闭上了眼睛。 我记得那夜的月亮很亮,很圆。 然而,我回绝!当我睁开眼睛的时候,曾经是中午了。 “明天 xxx 的事件你晓得吗?天啊,这个世道真的是。” “谁说不是呢?最近吃瓜真的是吃的累了。” “这么多钱,咱们全家从山顶洞人开始干都挣不到。” 听着四周七嘴八舌的声音,我感觉有些懵。 睡了个午觉,又产生什么我不晓得的事件了? 我慌忙地掏出手机,关上 APP,找到热榜,开始贪心的排汇着热点的信息,心愿跟上这个变化莫测的时代。 可是,下一刻我感觉有一些迷茫,我为什么要手不释卷地追赶每天的热点呢? 大略是想和别人有一些茶余饭后的谈资。大略是心田感觉不应该错过正在产生的每一件小事。 然而,我感觉所有本不应该这样。 “只有我违心在手机里装置摆渡、围脖、B乎这些 APP,忍受着每天无尽的推送,广告,10min 刷一次音讯热榜,我就不会错过产生的小事,是吗?” “然而,我回绝!” 信息,是为人服务的。而不是人成为信息的奴隶。 我想在这个互联网时代,设计一款以人为外围的吃瓜服务。 云雀叫了一整天记得新近少年时,还没有接触过互联网,能接触世界的大略只有电视和报纸。 信息不多,反而没有那么多信息焦虑。 我心愿这个吃瓜服务能够满足上面的条件: (1)收费 (2)免装置 (3)简洁 (4)无广告 乙方听了想打人,甲方听了连夜申请破产。 诚然,想全副做到有些难,不过也不是不可能。 那么代价是什么呢? $dollar$。 没错,天下没有收费的午餐,除非有人替咱们付款。 于是,第一步,掏钱买服务器。 第二步,产品设计。 (1)免装置 要想做到免装置,可选的计划并不多。 基于网站,或者小程序。当然,小程序的限度比拟多。 于是,我抉择了邮件。 只须要提供邮件,就能够定时接管每天的热点信息。 (2)简洁性 要多简洁呢? 简洁到张小龙直呼拜服,美工间接下岗就行。 邮件的接管界面如下: (3)定制化 每个用户关注的内容不同,能够自在配置接管的信息。 接下来就差一个程序员就能够上市了。 什么?没钱请。算了,我本人来吧。 机器人朝九晚五有什么错?于是加班加点了一周,总算是把前后端的代码写完了。 接下来还不是小菜一碟,3 * (5/2) 搞定了根本环境装置。 服务部署,发现页面不显示,各种 BUG 搞了一天,最初算是跑起来了。 ...

December 25, 2021 · 1 min · jiezi

关于全栈:前端文件上传与后台数据返回展示

1.前端代码-HTML<div class="second-second" v-show="firstflag"> <input type="file" ref="clearFile" @change="getFile($event)" class="add-file-right-input" accept=".txt,.docx,.doc,.pdf" style="margin-top: 20px"> <span style="display:block;margin-top: 20px">反对扩展名:.txt .doc .docx .pdf </span> <div class="file" v-html="loadxy"></div> <div style="margin-top: 20px"> <input type="button" class="btn btn-primary" @click="submitAddFile" value="开始上传"/> </div></div>2.前端代码-JS/*抉择文件*/ getFile:function(event){ var file = event.target.files; for(var i = 0;i<file.length;i++){ //上传类型判断 var imgName = file[i].name; var idx = imgName.lastIndexOf("."); if (idx != -1){ var ext = imgName.substr(idx+1).toUpperCase(); ext = ext.toLowerCase( ); if (ext!='pdf' && ext!='doc' && ext!='docx' && ext!='txt'){ }else{ this.addArr.push(file[i]); } }else{ } } },/*开始上传*/ submitAddFile:function(){ if(0 == this.addArr.length){ layer.msg("请抉择文件", {icon: 1}); return; } var formData = new FormData(); for(var i=0;i<this.addArr.length;i++){ formData.append('file',this.addArr[i]); } const vm = this $.ajax({ type: "POST", url: baseURL + "air/crackCalculateController/upload", contentType:false, processData:false, data: formData, success: function(r){ if(r.code == 0){ layer.msg("操作胜利", {icon: 1}); vm.loadxy = r.ret }else{ layer.alert(r.msg); } } }); }3.后盾代码-Controller @PostMapping("/upload") @RequiresPermissions("air:crackCalculate:save") public R upload(@RequestParam("file") MultipartFile file) throws IOException { if (file.isEmpty()) { return R.ok().put("ret", "上传失败,请抉择文件"); } String fileName = file.getOriginalFilename(); String lastStr = fileName.substring(fileName.lastIndexOf(".")); String result = ""; if (".txt".equals(lastStr)) { //10,100,1000/n20,200,2000/n30,300,3000/n result = FileToString.convertStreamToString(file.getInputStream()); } else if ("doc".equals(lastStr)){ String prefix = fileName.substring(fileName.lastIndexOf(".")); File filef = null; try { filef = File.createTempFile(fileName, prefix); file.transferTo(filef); result = FileToString.convertDocToString(filef); } catch (Exception e) { e.printStackTrace(); } finally { // 操作完下面的文件 须要删除在根目录下生成的临时文件 File f = new File(filef.toURI()); f.delete(); } } else if (".docx".equals(lastStr)){ String prefix = fileName.substring(fileName.lastIndexOf(".")); File filef = null; try { filef = File.createTempFile(fileName, prefix); file.transferTo(filef); result = FileToString.convertDocxToString(filef); } catch (Exception e) { e.printStackTrace(); } finally { // 操作完下面的文件 须要删除在根目录下生成的临时文件 File f = new File(filef.toURI()); f.delete(); } } return R.ok().put("ret", result); }} ...

May 28, 2021 · 2 min · jiezi

关于全栈:全栈开发一款团购小程序应用

笔者关注云开发曾经很久了,最近入手将之前做的一款团购小程序重构并迁徙到了云开发上,同时将源码开源,欢送感兴趣的敌人一起交换。代码仓库界面截图案例展现技术选型小程序 底层框架: Taro 3.0 (React)界面:Vant状态机:SWR治理后盾界面 底层框架:React界面:eui状态机:SWR服务端 CloudBase 云开发目前Taro曾经进入了3.x时代,能够让开发者应用残缺的React、Vue等框架进行开发。笔者作为一个重度React使用者天然会在泛滥框架中选用Taro(之后会尝试Kbone)。 因为这次要开发的购物类小程序故而会选用有赞开源的Vant控件库。 状态机(State Machines)方面,抉择了更加轻量的Hook计划。在Hook计划中调研了两个库 react-query与swr,整体来说swr更加的轻量便捷。 治理端控件库方面,目前国内React体系下绝大多数都会选用Antd控件库,说实话笔者是一个爱尝鲜的人,在上一个开源我的项目( lucky_bilibili_web)中尝试了微软开源的FabricUI 库。此次又盯上了elastic开源的EUI,用完后感觉十分的教训!用这套控件库开发一些纯工具类的利用切实是太便捷了。 本文开端会放出一张用工这个控件库做工具类利用的图1,齐全是用EUI控件组合进去的,大家能够感受一下。 服务端方面,笔者关注serverless很久,早前都是国外的资源很多,另外也很眼馋Google的Firebase。笔者之前开发小程序都是自购服务器,自建服务端,还须要日常对服务器运维,费神费劲。 当初非常感谢腾讯云退出到了serverless生态的建设中,使得国内的开发者也能无障碍的应用serverless服务。CloudBase云开发团队更是对serverless进行了再包装,升高了serverless学习的复杂性,做到了开箱即用,一键部署。 数据库设计商品、界面展现相干表 用户、订单、领取相干表 管理员相干表 关键技术点笔者在开发这块小程序时也遇到了各种各样的问题与艰难,在社区中查阅了大量材料做了各种测试也都找到了答案,很想一次性的总结都放到这里,本篇因为篇幅无限,也不想把社区中他人发的货色再反复的发一边,这里先已源码标注的模式做总结 Talk is cheap,Show me the code。 之后会有一些笔者本人总结的技术实现计划带上私货独自发文。 小程序相干: 在Taro中应用有赞Vant控件库参见源码: /mini/src/app.config.ts/mini/config/index.js //line 51/mini/config/index.js //line 16markdown在小程序中渲染参见源码 /mini/src/components/wemark/mini/config/index.js //line 74/mini/src/hooks/useProducts.ts //line 40/mini/src/lib/b64.ts/mini/src/pages/detail/detail.config.ts/mini/src/pages/detail/detail.tsx //line 165/mini/global.d.ts领取参见源码 /mini/src/pages/order/detail/detail.tsx //line 71/cloud/functions/pay/cloud/functions/pay_cbTaro中应用css in js参见源码 /mini/config/index.js //line 39/mini/src/conponents/product-list/index.tsx //line 10/mini/linaria.config.js/mini/babel.config.js自定义Nav与Tabber参见源码 /mini/src/app.config.ts //line 41/mini/src/app.config.ts //line 95/mini/src/components/nav/mini/src/components/tabbarCI CD继续集成参见源码 /mini/wx_ci.js治理后盾相干 主题切换参见源码 /manage/src/theme/niceup/manage/src/lib/theme.ts集成CloudBase参见源码 /manage/src/lib/tcb.ts治理端实现退款注:小程序云开发的退款只反对中手机端发动申请,我这里做了变通,通过HTTP API的模式实现了退款 参见源码 /manage/src/lib/tcb.ts //line 18/manage/src/hook/useOrderMuation.ts //line 81/cloud/functions/mini-proxy/cloud/functions/refund数据统计分析参见源码 ...

January 20, 2021 · 1 min · jiezi

程序员常用工具

平时收集的常用工具分享给大家!!! 项目地址: https://github.com/abc-club/f... 持续更新中,喜欢请star 性能监控阿里云监控 (网站性能、错误等监控)growingio (网站访问量监控)sentry (错误监控)fundebug (错误监控)gtmetrix (网站访问速度)zanePerfor (网站访问速度)pingdom (网站状况监控)IDEvscodesublimewebstorm调试工具fiddlercharlesPacket Capture(android无Root抓包)在线工具codepencaniusebrowserhacks (一些浏览器兼容写法)字体图标font-awesomeiconfonticomoon设计资源uigreat花瓣dribbblebehance站酷FWA图片squooshgifski(生成gif)Tinypng | 智图 (压缩图片)标你妹啊 (psd 标注)Cool Backgrounds (生成好看的渐变背景图)carbon&t=seti&wt=none&l=auto&ds=true&dsyoff=20px&dsblur=68px&wc=true&wa=true&pv=48px&ph=32px&ln=false&fm=Hack&fs=14px&si=false&es=2x&wm=false) (生成类似 mac 风格的代码图片,用于分享)Unsplash Source (生成随机图片)CSS Sprite Generator (生成雪碧图)iconfont (阿里巴巴矢量图标库)Preloaders | LOADING.IO (加载图,有些是收费的)desktoppr (好看的壁纸)Material icons (Material icons图标) 代码类Ubuntu pastebin (代码分享)Codepen (在线代码编辑)Jsbin (在线代码编辑)CodeSandbox (在线写React,自动编译,有代码提示)Ultimate CSS Gradient Generator (生成 css 渐变)Grabient (生成漂亮的 css 渐变)Character Entity Reference Chart (各种符号的转义字符)css三角形产生器缓动函数速查表Regexper (正则可视化)Regex101 (正则表达式测试)Visualgo (数据结构,算法可视化)Animista (在线生成 css 动画)PageSpeed Insights (测试网站速度,优化性能)Learn Git Branching (以动画的形式让你学习 git)Asciiflow (生成类似代码注释里那种佛祖的代码。。自己画????)PXtoEM (PX EM 单位换算)epic-spinners (一个好看的css loading 代码库)效率类墨刀 (画原型图)石墨文档 (多人实时协作的云端文档与表格)resume-examples (简历模板)Enhancv (生成简历)KOPPT (ppt 模板)Canva (设计模板)ProcessOn (在线画流程图,思维导图、UI原型图等等)WakaTime (跟踪项目花费的时间,得装插件)Screen Sizes (移动屏幕尺寸)Habitica (游戏化Todo)Smallpdf (非常厉害的一个网站,PDF压缩,PDF转PPT,Word,Excel等等都可以直接通过这个页面实现)草料二维码 (在线生成二维码)声享 (在线制作 PPT)幕布 (极简大纲笔记,一键生成思维导图)查询类devhints (常用速查表,快速查询各类框架和库的常用方法,很实用)印记中文 (快速查询各类框架和周边库的中文文档)云服务阿里云腾讯云比目云远程桌面vncvncServer/ vnc-viewerVNC轻松连接远程Linux桌面 https://jingyan.baidu.com/art...官网 https://www.realvnc.com/en/teamviewerppthttp://www.slideshare.net/ (需翻墙) ...

October 2, 2019 · 1 min · jiezi

2019-Java-全栈工程师进阶路线图一定要收藏

技术更新日新月异,对于初入职场的同学来说,经常会困惑该往那个方向发展,这一点松哥是深有体会的。 <!--more--> 我刚开始学习 Java 那会,最大的问题就是不知道该学什么,以及学习的顺序,我相信这也是很多初学者经常面临的问题。我当时经常胡子眉毛一把抓,那会学习资料倒是不缺,学校图书馆啥都有,就是无从下手,后来有高人指导之后,进步就很快了。 精研某一个方向,或者走全栈路线,都是可以的,两种路线各有优缺点,如果非要整个争个高下,我觉得没有必要。 自己喜欢的,才是最好的,我读书的时候就接过几百块钱的小活,没几个钱,要是跟人合作更没有赚头了,所以后来我一直在尝试全栈的路线,也一直在这条路上努力。 专精于某一方面,成为某一个领域的执牛耳者,也是让人钦佩了。 结合我自己的经验,我整理了一份 Java 全栈工程师进阶路线图,给大家参考。我整理出来的大部分知识点都有相关的学习资源,大家在公众号后台回复相应的口令就可以获取相关资源(学习资源口令)。 希望大家明白,如果你是在校学生,有大把时间,个人觉得这些东西可以挨个去学,如果你已经工作了,可以根据公司的业务需求有针对性的去学习,下面的列表仅仅起一个参考的作用,当你想学的时候,知道有哪些东西需要学习。 乾坤大挪移第一层第一层心法,主要都是基本语法,程序设计入门,悟性高者十天半月可成,差一点的 3 到 6 个月也说不准。如果有其他开发语言的功底相助,并且有张无忌的悟性与运气,相信第一层只在片刻之间就练成了。 第一层主要包括如下部分(已经列好顺序): Java 基础语法Java 面向对象Java 常用类详解Java 异常机制Java 集合与数据结构Java IOJava 多线程Java 网络编程Java 注解+反射23 种设计模式正则表达式XML 解析/ JSON 解析Java 10、11、12 新特性AIO、BIO、NIO乾坤大挪移第二层第二层主要是修炼数据库,从基本用法到查询优化、读写分离等等都需要掌握,这里以 MySQL 数据库为例: 数据库的基本概念数据库和表的基本操作索引与数据完整性约束数据库中的各种复杂查询操作MySQL 中常见函数的使用存储过程、触发器以及事件等数据库的备份与恢复数据库用户管理与数据库安全性事务和多用户读写分离环境搭建+实践JDBC常见数据库连接池的配置+使用乾坤大挪移第三层第三层主要是修炼 Web 基础,主要包括前端的基础知识,先不用深入学习前端,后端的 Jsp/Servlet,有人会说现在公司都不用 Jsp/Servlet 了,还学这些干嘛?但是万变不离其宗,哪个顶尖高手不是从扎马步开始的?这些掌握好了,框架的原理才好理解。 HTMLCSSJavaScriptjQueryTomcatServlet(基本用法,Session、Cookie 等)Jsp(原理、九大内置对象等)EL 和 JSTL过滤器/监听器等AjaxEasyUIEChartsBootStrapGit/SvnWebSocket前三层练好后,做个大学的毕设应该是够用了。 乾坤大挪移第四层第四层主要是修炼各种框架以及工具: SpringSpringMVCMyBatisMaven/GradleFreemarker/ThymeleafLinuxActiveMQ/RabbitMQNettyZookeeperDubboRedisRBACShiroElasticsearchNginxSSOActivitiQuartzSpring BatchMongoDBSpring CacheJpa这一层修炼完,你已经基本上达到了阳顶天的水平了,阳顶天是明教教主,那你出去找个项目经理的位置坐坐估计差不多吧。 乾坤大挪移第五层最后还不得不说 Java 目前最火的微服务,这也是一项必备技能: Spring Boot 基本原理Spring Boot 基础配置Spring Boot 整理视图层技术Spring Boot 整合 Web 开发Spring Boot 整合持久层技术Spring Boot 整合 NoSQLSpring Boot 构建 RESTful 服务Spring Boot 整合各种缓存Spring Boot 安全管理Spring Boot 整合 WebSocketSpring Boot 整合消息服务Spring Boot 整合 Swagger、邮件等Spring Boot 应用监控Spring Cloud Eureka、Consul微服务注册与消费Spring Cloud OpenFeign服务容错保护 Resilience4jSpring Cloud Zuul/GatewaySpring Cloud ConfigSpring Cloud BusSpring Cloud StreamSpring Cloud Sleuth/ZipkinSpring Cloud AdminSpring Cloud Alibaba第五层修炼成功后,让老板加波薪水应该是可以的吧! ...

July 15, 2019 · 1 min · jiezi

ReactKoaMongoDBDocker开发环境

前言本次博文依然是对 multi-spa-webpack-cli 的扩充和完善。 集成 mongoose。集成 Docker 开发环境。multi-spa-webpack-cli 已经发布到 npm,只要在 node 环境下安装即可。 npm install multi-spa-webpack-cli -g使用步骤如下: # 1. 初始化项目multi-spa-webpack-cli init spa-project# 2. 进入文件目录cd spa-project# 未使用 Docker# 3. 打包不变的部分npm run build:dll# 4. 启动项目(手动打开浏览器:localhost:8090)npm start# 5. 启动 MongoDBmongod# 6. 启动服务cd servernpm installnpm start# 使用 Docker(需安装docker)# 3. 启动项目(手动打开浏览器:0.0.0.0:8090)npm run docker:dev从上面的步骤可以看出,Docker 只需要 3 步就可以启动项目了。 mongoosemongoose 是在 node.js 环境下对 MongoDB 进行便捷操作的对象模型工具。在没开始之前,要先安装 MongoDB。安装 MongoDB 的过程中,可能有些小麻烦,尤其是公司的电脑(谁也不知道电脑里配置了什么东西)。安装过程可参照 【官网:安装MongoDB】 还要知道 MongoDB 的一些概念。 SQL术语/概念MongoDB术语/概念解释/说明databasedatabase数据库tablecollection数据库表/集合rowdocument数据记录行/文档columnfield数据字段/域indexindex索引tablejoins表连接,MongoDB不支持primary keyprimary key主键,MongoDB自动将_id字段设置为主键数据库服务和客户端: SQLMongoDBMysqld/Oraclemongodmysql/sqlplusmongomongoose 相关概念看看官网就好了【mongoose 中文文档】 ...

July 6, 2019 · 2 min · jiezi

一文读懂NodeJS全栈开发利器CabloyJS万字长文

1 基本概念1.1 CabloyJS是什么1.1.1 定义CabloyJS是一款顶级NodeJS全栈业务开发框架1.1.2 特点CabloyJS是采用NodeJS进行全栈开发的最佳实践CabloyJS不重复造轮子,而是采用业界最新的开源技术,进行全栈开发的最佳组合CabloyJS前端采用VueJS + Framework7 + WebPack,后端采用KoaJS + EggJS,数据库采用MySQLCabloyJS时刻跟踪开源技术的最新成果,并持续优化,使整个框架时刻保持最佳状态1.1.3 理念既可快速开发,又可灵活定制为了实现此理念,CabloyJS内置开发了大量核心模块,使您可以在最短的时间内架构一个完整的Web项目。比如,当您新建一个Web项目时,就已经具备完整的用户登录与认证系统,也具有验证码功能,同时也具备用户管理、角色管理、权限管理等功能 此外,这些内置模块提供了灵活的定制特性,您也可以开发全新的模块来替换内置模块,从而实现系统的定制化 1.2 CabloyJS核心解决什么问题场景碎片化业务模块化1.2.1 场景碎片化1) 先说说Mobile场景我们知道,随着智能机的日益普及,咱们开发人员所面对的需求场景与开发场景日益碎片化,如浏览器、IOS、Android,还有大量第三方平台:微信、企业微信、钉钉、Facebook、Slack等等 随着智能设备性能越来越好,网速越来越快,针对如此众多的开发场景,采用H5开发必将是大势所趋。只需开发一套代码,就可以在以上所有智能设备中运行,不仅可以显著减少开发量,同时也可以显著提升开发效率,对开发团队和终端用户均是莫大的福利 2) 再来谈谈PC场景以上咱们说H5开发,只需开发一套代码,就可以在所有智能设备中运行。但是还有一个开发场景没有得到统一:那就是PC场景 由于屏幕显示尺寸的不同,PC场景和Mobile场景有着不同的操作风格。有些前端UI框架,采用“自适应”策略,为PC场景开发的页面,在Mobile场景下虽然也能查看和使用,但使用体验往往差强人意 这也就是为什么有些前端框架总是成对出现的原因:如Element-UI和Mint-UI,如AntDesign和AntDesign-Mobile这也就意味着,当我们同时面对PC场景和Mobile场景时,仍然需要开发两套代码。在面对许多开发需求时,这些重复的工作量往往是难以接受的: 比如,我们在企业微信或钉钉上开发一些H5业务应用,同时也希望这些应用也可以在PC端浏览器中运行比如,我们为微信公共号开发了一些H5业务应用,同时也希望这些应用也可以在PC端浏览器中运行。同时,还可以在同一架构下开发后台管理类功能,通过区别不同的登录用户、不同的使用场景,从而显示不同的前端页面3) PC = MOBILE + PADCabloyJS前端采用Framework7框架,目前已同步升级到最新版Framework7 V4。CabloyJS在Framework7的基础上进行了巧妙的扩展,将PC端的页面切分为多个区域,实现了多个Mobile和PAD同时呈现在一个PC端的效果。换句话说,你买了一台Mac,就相对于买了多台IPhone和IPad,用多个虚拟的移动设备同时工作,即显著提升了工作效率,也提供了非常有趣的使用体验 4) 实际效果有图有真相 也可PC端体验https://admin.cabloy.com 也可手机扫描体验 5) 如何实现的CabloyJS是模块化的全栈框架,为了实现PC = MOBILE + PAD的风格,内置了两个模块:egg-born-module-a-layoutmobile和egg-born-module-a-layoutpc。当前端框架加载完毕,会自动判断当前页面的宽度(称为breakpoint),如果小于800,使用Mobile布局,如果大于800,使用PC布局,而且breakpoint数值可以自定义 此外,这两个布局模块本身也有许多参数可以自定义,甚至,您也可以开发自己的布局模块,替换掉内置的实现方式 下面分别贴出两个布局模块的默认参数,相信您一看便知他们的用处 egg-born-module-a-layoutmobile export default { layout: { login: '/a/login/login', loginOnStart: true, toolbar: { tabbar: true, labels: true, bottom: true, }, tabs: [ { name: 'Home', tabLinkActive: true, iconMaterial: 'home', url: '/a/base/menu/list' }, { name: 'Atom', tabLinkActive: false, iconMaterial: 'group_work', url: '/a/base/atom/list' }, { name: 'Mine', tabLinkActive: false, iconMaterial: 'person', url: '/a/user/user/mine' }, ], },};egg-born-module-a-layoutpc ...

June 3, 2019 · 5 min · jiezi

vue+django+mysql实现移动端二手交易应用

这是一个用vue+django+mysql实现的移动端二手交易应用。效果展示相关仓库onehome:项目前端部分onehomeServer:项目后端部分onehomeDoc:项目的一些文档已完成功能[x] 登录[x] 注册[x] 首页展示[x] 发布商品信息(支持多图片上传)[x] 收藏/取消收藏[x] 私聊[x] 搜索[x] 消息提醒[x] 上传图像[x] 我的收藏[x] 我的发布[x] 修改密码[x] 退出登录

February 4, 2019 · 1 min · jiezi

前端技术演进(七):前端跨栈技术

这个来自之前做的培训,删减了一些业务相关的,参考了很多资料(参考资料列表),谢谢前辈们,么么哒 ????随着互联网架构的不断演进,前端技术框架从后台输出页面到后台MVC,再到前端MVC、MVP、MVVM,以及到Virtual DOM和MNV*的实现,已经发生了巨大的变化。整体上来看,前端也正在朝着模块化、组件化和高性能Web开发模式化的方向快速发展。除了传统桌面浏览器端Web上的应用,前端技术栈在服务端或移动端上的尝试和发展也从来没有停止过,而且形成了一系列成熟的解决方案。前端的技术栈能解决的不只是页面上的问题,前端工程师的追求也绝不只是页面上的技术。跨后端技术这几年全栈工程师已成为一个很热门的关键词,从最早的MEAN技术栈到后端直出,再到现在的前后端同构,前端通过与Node结合的开发模式越来越被开发者认同并在越来越多的项目中得到实践。前端开发者都热衷于在Node上开发有以下几个原因:Node是一个基于事件驱动和无阻塞的服务器,非常适合处理并发请求,因此构建在Node上的应用服务相比其他技术实现的服务性能表现要好。Node端运行的是JavaScript,对于前端开发者来说学习成本较低,要关注的问题相对来说比前端更纯粹些。作为一名前端工程师确实需要掌握一门后台语言来辅助自己的技术学习。Node端处理数据渲染的方式能够解决前端无法解决的问题,这在大型Web应用场景下的优势就体现出来了,这也是目前Node后端直出或同构的实现方式被开发者广泛使用的一个重要原因。Node后端开发Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时。有个叫Ryan Dahl的歪果仁,他的工作是用C/C写高性能Web服务。对于高性能,异步IO、事件驱动是基本原则,但是用C/C写就太痛苦了。于是这位仁兄开始设想用高级语言开发Web服务。他评估了很多种高级语言,发现很多语言虽然同时提供了同步IO和异步IO,但是开发人员一旦用了同步IO,他们就再也懒得写异步IO了,所以,最终,Ryan瞄向了JavaScript。在2009年,Ryan正式推出了基于JavaScript语言和V8引擎的开源Web服务器项目,命名为Node.js。Node第一次把JavaScript带入到后端服务器开发,加上世界上已经有无数的JavaScript开发人员,所以Node一下子就火了起来。Node最大的优势是借助JavaScript天生的事件驱动机制加V8高性能引擎,使编写高性能Web服务轻而易举。阻塞和非阻塞阻塞 是说 Node.js 中其它的 JavaScript 命令必须等到一个非 JavaScript 操作完成之后才可以执行。这是因为当 阻塞 发生时,事件机制无法继续运行JavaScript。在 Node.js 中,JavaScript由于 CPU 密集操作而表现不佳。而不是等待非 JavaScript操作 (例如I/O)。这被称为 阻塞。 阻塞 方法执行起来是 同步地 ,但是 非阻塞 方法执行起来是 异步地 。 使用文件系统模块读取一个文件,同步方法看上去如下:const fs = require(‘fs’);const data = fs.readFileSync(’/file.md’); // 这里会阻塞与之功能等同的 异步 版本:const fs = require(‘fs’);fs.readFile(’/file.md’, (err, data) => { if (err) throw err;});在第二个例子中, fs.readFile() 因为是 非阻塞 的,所以 JavaScript 会继续执行,不会发生阻塞, 这对于高效吞吐来说是绝佳的设计。 在 Node.js 中 JavaScript 的执行是单线程的,所以并行与事件轮询能力(即在完成其它任务之后处理 JavaScript 回调函数的能力)有关。任何一个企图以并行的方式运行的代码必须让事件轮询机制以非 JavaScript 操作来运行,像 I/O 操作。 比如 每个对服务器的请求消耗 50 毫秒完成,其中的 45 毫秒又是可以通过异步操作而完成的数据库操作。选择 非阻塞 操作可以释放那 45 毫秒用以处理其它的请求操作。这是在选择 阻塞 和 非阻塞 方法上的重大区别。Node.js 中的事件轮询机制和其它语言相比而言有区别,其它语言一般需要创建线程来处理并行任务。MEANNode出现的早期还不像现在一样拥有很复杂的概念,相关技术和语言的标准还不成熟,Node开发一般用的比较多的方案就是使用Express作为Web框架进行小型的Web站点建设,与之结合的主流技术则以M(Mysql)、E(Express)、 A(Angular)、 N(Node)最为典型,甚至到了今天MEAN技术组合的方式仍在沿用。前端一般使用Angular来管理实现页面应用,服务端Web框架以Express为主,同时使用免费开源的MongoDB数据库,这样就可以很快地构建一个Web应用了。今天可能不一定再去选择使用它,因为可以代替实现的成熟方案已经很多了,各类其他前后端框架都可以用来灵活组合作为MEAN的替代选型方案,比如 Vue、React可以替代 Angular,Koa 可以替代 Express,数据库的选择也有很多。Node后端数据渲染对于前端开发者来说,在大型Web应用开发中,很多时候并不需要完全重新设计整个应用后台的架构,更多的情况下需要结合Node的能力帮助我们解决前后端分离开发模式下无法解决的问题。我们先来看下通常前后端分离的开发模式下有哪些问题,利用Node 端的服务又是如何帮助我们解决这些问题的:SPA场景下SEO的问题通常情况下,SPA应用或前后端分离的开发模式下页面加载的基本流程是:浏览器端先加载一个空页面和JavaScript 脚本。然后异步请求接口获取数据。渲染页面数据内容后展示给用户。那么问题来了,搜索引擎抓取页面解析该页面HTML中关键字、描述或其他内容时,JavaScript尚未调用执行,搜索引擎获取到的仅仅是一个空页面,所以无法获取页面上<body>中的具体内容,这就比较影响搜索引擎收录页面的内容排行了。尽管我们会在空页面的<meta>里面添加keyword和description的内容,但这肯定是不够的,因为页面关键性的正文内容描述并没有被搜索引擎获取到。如果使用Node后端数据渲染(有人称之为直出或服务端渲染 SSR),在页面请求时将内容渲染到页面上输出,那么搜索引擎获取到的HTML就已经包含页面完整的内容,页面也就更容易被检索到了。前端页面渲染展示缓慢的问题除了SEO问题,在前后端分离的开发模式下页面在JavaScript执行渲染之前是空白的(或提示用户加载中)。用户在看到数据时已经花费的网络等待时间包括:DOM下载时间 + DOM解析时间 + JavaScript 文件请求时间 + JavaScript部分执行时间 + 接口请求时间 + DOM渲染时间。这时用户看到页面数据时已经是三次串行网络资源请求之后的事情了。如果使用后端直出来进行数据渲染,首先SEO的问题不复存在,用户浏览器加载完DOM的内容解析后即可立即展示,网络加载的问题也得到解决。其他的逻辑操作(如事件绑定和滚动加载的内容)则可按需、按异步加载,从而大幅度减少展示页面内容花费的时间。一般后台页面数据直出的通用架构设计如下:直出层接受前端的路由请求,并在Node端的Controller层异步请求服务接入层接口,获得Model数据并进行组装拼接,然后提取相对应的Node端View模板渲染出HTML输出给用户浏览器,而不用通过前端JavaScript请求动态数据后渲染。不仅如此,直出层根据不同的浏览器userAgent,也可以提取不同的模板渲染页面返回给不同的用户浏览器,所以这种实现方式不仅非常适合大型应用服务的实现场景,而且可以方便地实现网站的响应式内容直出。前后端同构在前后端分离的开发模式上加入直出层,解决了SEO和数据加载显示缓慢的问题。可是有两个新的问题:前端的开发实现向直出层偏移,不得不在原来的开发模式上做出修改来 适应直出层内容的开发,例如修改后端模板来适应现有的开发模式,结果我们不得不维护两套不同的前后台模板或技术实现——前端渲染实现逻辑和后端直出实现逻辑,尽管可能都是用JavaScript写的。如果是在移动端Hybrid应用上,离线包机制实现可能就会出现问题。因为每次都是从后端直出HTML结构给前端,这样就难做到将HTML文件进行离线缓存,而只能进行其他静态文件的缓存。在Hybrid App的应用场景下,其实我们更希望做到的是移动端首次打开页面时使用后端直出内容来解决加载慢和SEO问题,而在有离线缓存的情况下则使用客户端本地缓存的静态文件拉取数据返回渲染的方式来实现,或者未来在高版本的浏览器支持HTTP2的条件下使用前端渲染,低端浏览器不支持HTTP2的情况下则使用直出的方式实现。所以需要一套完善的开发方式,和原有开发方式保持一致,且能够同时用于前后端分离的开发模式和后端数据渲染模板开发方式中。这种开发模式就是我们所说的前后端同构。实现同构的核心前后端同构的宗旨是,只开发一套项目代码,既可以用来实现前端的JavaScript 加载渲染,也可以用于后台的直出渲染。为什么可以这样做呢?和前端渲染数据内容的方式相同,页面直出层内容也是通过数据加上模板编译的方式生成的,前端渲染和后台直出的模式生成DOM结构的区别只在于 数据和模板的渲染发生在什么时候。如果使用一套能在前端和后端都编译数据的模板系统,就可以做到使用同一套开发代码在前后端分别进行数据渲染解析。因此前后端同构的核心问题是实现前后台数据渲染的统一性。同构的优势除了解决前后端开发方式的问题,前后端同构的网站具有一些明显的优势:可以根据用户的需求方便地选择使用前端渲染数据还是后台直出页面数据;开发者只需维护一套前端代码,而且可以沿用前端原有的项目组件化管理、打包构建方式,根据不同的构建指令生成类似的前后端数据模板或组件在前后端执行解析,所以这对于DOM结构层上的开发方式应该是一致的。前后端同构的实现原理基于数据模板的前后端同构方案早在前端MVC开发的时代,前端模板的使用就非常广泛,例如Mustache、Handlebar 等,基本原理是将模板描述语法与数据进行拼接生成HTML代码字符串插入到页面特定的元素中来完成数据的渲染。同理,后端直出层也可以通过该方法来实现数据的渲染产生HTML字符串输出到页面上。如果前后端使用同一个模板解析引擎,那么我们只需要编写同一段模板描述语法结构就可以在前端和后端分开进行渲染了。比如同样的模板:<div class=“entry”> <h1>{{title}}</h1> <div class=“body”> {{body}} </div></div>前端,后端拿到数据后解析保持一致:{ “title”: “Hello”, “body”: “World”}<div class=“entry”> <h1>Hello</h1> <div class=“body”> World </div></div>对于前端开发的同一段模板语法结构,我们既可以选择在浏览器端渲染生成HTML字符串输出,也可以选择在后端渲染生成HTML字符串输出。如果选择在前端渲染,则可以将模板进行打包编译,在数据请求成功后进行DOM渲染;如果选择后端渲染,就可以将模板数据直接发送到直出层的View视图进行渲染,实现同一个模板语法结构在前后端渲染出相同的内容。这里的前提是要保证前后端使用的模板渲染引擎或者模板解析的语法是一致的。基于MVVM的前后端同构MVVM框架页面上的JavaScript逻辑主要是通过Directive(不只是Directive,还有filter、 表达式等,以Directive为主)来实现的,一般前端页面加载完成后会开始扫描DOM结构中的Directive指令并进行DOM操作渲染或事件绑定,所以数据的显示仍然需要页面执行Directive后才能完成。那么如果将Directive的操作在直出层实现,浏览器直接输出的页面就是渲染后的内容数据了。<div class=“entry”> <h1 x-html=“title”></h1> <div class=“body” x-html=“body”></div></div>前端编写的同一段MVVM的语法结构,通过前端MVVM框架解析或后端Directive 运行解析最终都可以生成相同的HTML结构,不同的是前端执行解析后生成的是ViewModel对象并通过浏览器体现,后端渲染则生成HTML标签的文本字符串输出给浏览器。这里同样需要做一件事,即在后台实现一个与前端解析Directive相同的模块,甚至还包括filter、语法表达式等的实现。这样就可以在前后端完成同一段语法结构的解析了。基于VirtualDOM的前后端同构之前说过,VirtualDOM作为一种新的编程概念被广泛应用在实际项目开发中,其核心是使用JavaScript 对象来描述DOM结构。那么既然Virtual DOM是一个JavaScript对象,就表示其可以同时存在于前后端,通过不同的处理方式来实现同构。在前端开发的组件中声明某段VirtualDOM描述语法,然后通过VirtualDOM框架解析生成VirtualDOM,这里的VirtualDOM既可以用于在浏览器端生成前端的DOM结构,也可以在直出层直接转换成HTML标记的文本字符串输出,后面这种情况就可以在服务端上实现Virtual DOM到HTML文本字符串的转换。这样,通过对Virtual DOM的不同操作处理,就可以统一前后端渲染机制,实现组件的前后端对同一段描述语法进行渲染。这里VirtualDOM上的逻辑实现仍然需要在浏览器端进行事件绑定来完成,最好能让同构框架帮助我们自动完成,根据HTML的结构进行特定的事件绑定处理,保证最后展示给用户的页面是完整且带有交互逻辑的。无论哪一种方式,核心都体现在HTML的结构形式变化上,页面内容的描述方式有很多,而且可以通过特定的处理过程实现转化,这样就提供了更多的可能性。Egg.jsNode虽然生态比较火热,但是至今还没有一款公认的成熟的企业级框架,主要是因为使用Node来开发大型后端应用的企业还很少。现在主要有两款:Sails 和 Egg.js。设计原则一个插件只做一件事:Egg 没有内置很多额外的功能,而是通过插件的方式来实现,Egg 通过框架聚合这些插件,并根据自己的业务场景定制配置,这样应用的开发成本就变得很低。约定优于配置:按照一套统一的约定进行应用开发,团队内部采用这种方式可以减少开发人员的学习成本,这也是很多框架的思路。特点提供基于 Egg 定制上层框架的能力:可以基于 Egg 去封装适合团队的上层框架。高度可扩展的插件机制:可以促进业务逻辑的复用,生态圈的形成。内置多进程管理。基于 Koa 开发,性能优异:支持所有的Koa中间件。框架稳定,测试覆盖率高。渐进式开发:可以流畅的实现编码 –> 编码抽象成功能 –> 功能抽象成插件 –> 插件封装到框架 的渐进过程。https://eggjs.org/zh-cn现在我们部门的Node项目基本上是 Koa,Egg流。其他部门也有 Express 流。跨终端技术移动端移动互联网兴起后,智能移动设备出现,大量应用市场的Native应用也开始涌现。随着第一波移动端互联网开发浪潮渐渐平静,各类Native应用开始进入有序更新迭代的阶段。人们对移动互联网需求急剧增长,Native 应用快速迭代开发的需求也越来越多,但是现有Native应用的开发迭代速度依然无法满足市场快速变化的需要。随之而来的是HTML5的出现,它允许开发者在移动设备上快速开发网页端应用,并让移动互联网应用开发很快进入了Native应用、Web应用、Hybrid 应用并存的时代。在发展过程中,最大限度的利用原生能力成为了一大趋势。出现了 React Native、Weex 等框架,可以直接使用 Javascript 来编写原生应用。比如React Native,产出的并不是“网页应用”, 或者说“HTML5应用”,又或者“混合应用”。 最终产品是一个真正的移动应用,从使用感受上和用Objective-C或Java编写的应用相比几乎是无法区分的。import React, { Component } from ‘react’;import { Text, View } from ‘react-native’;class WhyReactNativeIsSoGreat extends Component { render() { return ( <View> <Text> 如果你喜欢在Web上使用React,那你也肯定会喜欢React Native. </Text> <Text> 基本上就是用原生组件比如’View’和’Text’ 来代替web组件’div’和’span’。 </Text> </View> ); }}也就是说即使不懂原生应用的开发,也可以用 Javascript 来编写原生应用了。桌面端现在,也可以使用 JavaScript, HTML 和 CSS 构建跨平台的桌面应用。通过 Electron 之类的应用,可以直接把 Web 项目打包成桌面应用,运行在各个操作系统中。著名的 Atom IDE 就是通过 Electron 构建的,其他的包括 VS Code、Skype、Github Desktop 之类的 App 也都是通过 Electron 构建的。 ...

December 14, 2018 · 2 min · jiezi

小程序的全栈开发新时代

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~本文由heyli发表于云+社区专栏什么是小程序·云开发小程序·云开发是微信团队和腾讯云团队共同研发的一套小程序基础能力,简言之就是:云能力将会成为小程序的基础能力。整套功能是基于腾讯云全新推出的云开发(Tencent Cloud Base)所研发出来的一套完备的小程序后台开发方案。小程序·云开发为开发者提供完整的云端流程,简化后端开发和运维概念,无需搭建服务器,使用平台提供的 API 进行核心业务开发,即可实现快速上线和迭代。该解决方案目前提供三大基础能力支持:存储:在小程序前端直接上传/下载云端文件,在小程序云控制台可视化管理数据库:一个既可在小程序前端操作,也能在云函数中读写的文档型数据库云函数:在云端运行的代码,微信私有协议天然鉴权,开发者只需编写业务逻辑代码未来,我们还会集成更多的服务能力,为小程序提供更强有力的云端支持。如何使用小程序·云开发上面就是小程序·云开发简单的使用图谱:在小程序端,直接用官方提供的接口,在云函数端,直接用官方提供的 Node SDK,就可以操作你云的资源。以前开发小程序所担忧的数据库搭建、文件系统部署,通通没有。你只需要有在小程序开发 IDE 里面的 云开发,开通一下,填写环境 ID,便可以拥有小程序的云能力!当然,其实用云开发,并不排斥原有的后台架构,通过下面的架构,你也可以无缝与原有的后台服务兼容,也简化了一些小程序鉴权的逻辑:接下来,我会分别从小程序端、服务端讲述如何使用这些云资源。使用云能力小程序端客户端,这里是指在小程序端中。如果要使用云开发能力,请做以下配置:在 app.json / game.json 中, 中增加字段 “cloud”: trueproject.config.json 中增加了字段 cloudfunctionRoot 用于指定存放云函数的目录初始化云开发能力://app.jsApp({ onLaunch: function () { wx.cloud.init({ traceUser: true // 用户信息会显示在云开发控制台的用户面板中 }); }});小程序端初始化能力文档在用户管理中会显示使用云能力的小程序的访问用户列表,默认以访问时间倒叙排列,访问时间的触发点是在小程序端调用 wx.cloud.init 方法,且其中的 traceUser 参数传值为 true。服务端如果你想在云函数中,操作文件、数据库和云函数资源,你可以使用我们提供的服务端 SDK 进行操作。首先,进入到你的某个云函数中,安装以下依赖包:npm i –save tcb-admin-node在云函数中初始化// 初始化示例const app = require(’tcb-admin-node’);// 初始化资源// 云函数下不需要secretId和secretKey。// env如果不指定将使用默认环境app.init({ secretId: ‘xxxxx’, secretKey: ‘xxxx’, env: ‘xxx’});//云函数下使用默认环境app.init()//云函数下指定环境app.init({ env: ‘xxx’});服务端初始化文档存储云开发提供存储空间、上传文件、下载文件、CDN加速文件访问等能力,开发者可以在小程序端与服务端通过 API 使用这些能力。小程序端// 选择图片wx.chooseImage({ success: dRes => { // 上传图片 const uploadTask = wx.cloud.uploadFile({ cloudPath: ${Date.now()}-${Math.floor(Math.random(0, 1) * 10000000)}.png, // 随机图片名 filePath: dRes.tempFilePaths[0], // 本地的图片路径 success: console.log, fail: console.error }); }, fail: console.error,});小程序端存储文档服务端const app = require(’tcb-admin-node’);app.init();app.uploadFile({ cloudPath: “cover.png”, fileContent: fs.createReadStream(${__dirname}/cover.png)}).then((res) => { console.log(res);}).catch((err) => { console.error(err);});;控制台上传好的文件,就会出现在控制台中,如下图。你可以在控制台里删除、下载或者查看图片的详情。你还可以控文件整体的权限,这里还有一些具体的介绍。服务端存储文档数据库小程序云提供文档型数据库 ( document-oriented database ),数据库包含多个集合(相当于关系型数据中的表),集合近似于一个 JSON 数组,数组中的每个对象就是一条记录,记录的格式是 JSON 文档。每条记录都有一个 _id 字段用以唯一标志这条记录、一个 _openid 字段用以标志记录的创建者,即小程序的用户。开发者可以自定义 _id,但不可在小程序端自定义(在服务端可以) _openid 。_openid 是在文档创建时由系统根据小程序用户默认创建的,开发者可使用其来标识和定位文档。数据库 API 分为小程序端和服务端两部分,小程序端 API 拥有严格的调用权限控制,开发者可在小程序内直接调用 API 进行非敏感数据的操作。对于有更高安全要求的数据,可在云函数内通过服务端 API 进行操作。云函数的环境是与客户端完全隔离的,在云函数上可以私密且安全的操作数据库。数据库 API 包含增删改查的能力,使用 API 操作数据库只需三步:获取数据库引用、构造查询/更新条件、发出请求。切记,在操作数据库前,请先在控制台中创建 collection。小程序端const db = wx.cloud.database();// 插入数据db.collection(‘photo’).add({ data: { photo: ‘cloud://tcb-xxx/05ca1d38f86f90d66d4751a730379dfa6584dde05ab4-Ma9vMN_fw658.jpg’, title: ‘风景’ }});// 提取数据db.collection(‘photo’).get().then((res) => { let data = res.data; console.log(data);});// 输出// 在小程序端, _openid 会自动插入到数据库中{ photo: ‘cloud://tcb-xxx/05ca1d38f86f90d66d4751a730379dfa6584dde05ab4-Ma9vMN_fw658.jpg’, title: ‘风景’, _openid: ‘oLlMr5FICCQJV-QgVLVzKu1212341’}小程序端数据库文档服务端const app = require(’tcb-admin-node’);app.init();const db = app.database();db.collection(‘photo’).limit(10).get().then((res) => { console.log(res);}).catch((err) => { console.error(err);});// 输出// 因为是在服务端,其它用户的也可以提取出来{ photo: ‘cloud://tcb-xxx/05ca1d38f86f90d66d4751a730379dfa6584dde05ab4-Ma9vMN_fw658.jpg’, title: ‘风景’, _openid: ‘oLlMr5FICCQJV-QgVLVzKu1342121’}{ photo: ‘cloud://tcb-xxx/0dc3e66fd6b53641e328e091ccb3b9c4e53874232e6bf-ZxSfee_fw658.jpg’, title: ‘美女’, _openid: ‘DFDFEX343xxdf-QgVLVzKu12452121’}{ photo: ‘cloud://tcb-xxx/104b27e339bdc93c0da15a47aa546b6e9c0e3359c315-L8Px2Y_fw658.jpg’, title: ‘动物’, _openid: ‘DFDFEX343xxdf-QgVLVzKu1342121’}服务端数据库文档控制台可以在控制台里,看到用户操作的数据,你也可以自己在控制台上添加、更新或删除数据。如果数据量庞大,可以设置索引提供查询的效率。数据库也可以通过设置权限,管控每个 collection。云函数云函数是一段运行在云端的代码,无需管理服务器,在开发工具内一键上传部署即可运行后端代码。开发者可以在云函数内获取到每次调用的上下文(appid、openid 等),无需维护复杂的鉴权机制,即可获取天然可信任的用户登录态(openid)。小程序端wx.cloud.callFunction({ name: ‘addblog’, // 云函数名称 data: { // 传到云函数处理的参数 title: ‘云开发 TCB’, content: ‘存储、数据库存、云函数’ }}).then(res => { console.log(res)}).catch((err) => { console.error(err);});小程序端云函数文档服务端const app = require(“tcb-admin-node”);app.init();app.callFunction({ name: ‘addblog’, // 云函数名称 data: { // 传到云函数处理的参数 title: ‘云开发 TCB’, content: ‘存储、数据库存、云函数’ }}).then((res) => { console.log(res);}).catch((err) => { console.error(err);});服务端云函数文档控制台上传好之后的云函数,都会在这里罗列出来。每次调用云函数,都可以在这里看到日志,还可以构造测试的参数,用于调试。语法糖大部份的接口,目前都支持两种写法,分别是Promise 和 Async/Await,本节以 callFunction作为例子,在云函数中介绍这两种写法。 Async/Await 本质上是基于 Promise 的一种语法糖,它只是把 Promise 转换成同步的写法而已。Promiseconst app = require(“tcb-admin-node”);app.init();exports.main = (event, context, callback) => { app.callFunction({ name: ‘addblog’, // 云函数名称 data: { // 传到云函数处理的参数 title: ‘云开发 TCB’, content: ‘存储、数据库存、云函数’ } }).then((res) => { console.log(res); callback(null, res.data); }).catch((err) => { callback(err); });};Async/Awaitconst app = require(“tcb-admin-node”);app.init();exports.main = async (event, context) => { let result = null; try { result = await app.callFunction({ name: ‘addblog’, // 云函数名称 data: { // 传到云函数处理的参数 title: ‘云开发 TCB’, content: ‘存储、数据库存、云函数’ } }); } catch (e) { return e; } return result;};在云函数里使用,由于是 Node 8.9 或以上的环境,因此天然支持 Async/Await 诘法,但在小程端要使用的话,需要额外引入 Polyfill,比如这个开源的项目:regenerator开发者资源由于小程序·云开发是基于腾讯云的云开发开发的功能,因此在腾讯云与小程序两边都有不少的开发者资源,这里供大家参阅读:腾讯云开发者资源及文档腾讯云云开发平台官方 Github微信小程序·云开发文档相关阅读【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识此文已由作者授权腾讯云+社区发布搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!海量技术实践经验,尽在云加社区! ...

October 30, 2018 · 2 min · jiezi