网站构建一个稳定、高效的后台服务器程序是一件非常重要的事情。要达到这样的目的,选择一款快速、高效的后台程序款框架是我们必须要考虑清楚的。一个后台框架是一系列工具、代码包以及其他软件模块的集合,利用这些基础设置你就可以快速的开发出功能全面的服务器后台程序。这些框架在设计之初就考虑到了将来的服务器程序要面临的需求,并且提供了比较合理全面的解决方案。我们只需要根据我们的需求,对应到这些框架的不同模块,利用这些模块实现我们的业务代码即可。
本人掌握了包含市面上大部分常用的编程语言以及相关的框架,也都使用过这些框架开发出了 server 程序。在2021年,我罗列出目前常用的几个框架与大家分享交流。
编程语言:PHP
laravel是一个免费、开源的PHP开发框架,它是基于MVC程序结构设计的。对于常年使用PHP语言做项目的人来说,laravel是普遍的首选方案。我以前接手的一些项目,云服务器平台是客户早年就在使用的,比如GoDaddy、Hostinger 等等,这些云平台对PHP语言的支持非常好,那么考虑到入乡随俗,要使用云服务里的PHP环境,那么用laravel就是非常合适的了。
laravel提供了权限管理、API 设计、后台缓存、日志管理、测试等多种功能。它的文档也非常的全面易懂。laravel 非常适合用来开发博客网站、门户网站、电商网站的后台。
不过时过境迁,由于现在更多更好的框架的出现,PHP语言以及laravel变得有些过时和年迈,很多人会暂时放弃PHP以及laravel,会尝试使用其他的选择。
编程语言:Python
我把这两个框架放在一起进行说明。几年前我在自学完Python语言后,就去寻找基于Python的服务器开发框架,flask和Django是两个常用的。在玩过了这两个框架之后,我明确的选择了Flask。因为我个人的开发风格和习惯是前后端分离的,用Angular或者Vue去专心开发前端页面,用框架细致的开发后端服务器的一些功能,前后端之间的通信和数据交换使用 Restful API 来实现。
Django也是一款比较强大的框架,但是它对前后端分离风格的开发者不太友好。在开发的时候很多时候需要将前端的HTML、JavaScript和后端的Python进行联合开发,代码可能会比较混乱。但是事情都有两面性,反过来讲Django的封装性更好一些,很多功能都是拿来即用的,只要根据自己的需求稍加修改,就可以快速的实现一些功能,比如form表单。
而 Flask 是纯粹的前后端分离的风格,属于微型框架。你在用Flask写代码的时候,可以完全不需要考虑前端。可以专心的开发服务器程序。最后提供一些 API 访问链接地址给前端即可。所以Flask 框架会比Django更小,使用flask也需要开发者去处理和开发更多的功能逻辑。
编程语言:JavaScript / TypeScript
得益于node.js的流行和广泛使用,历史悠久、可爱的JavaScript语言终于可以涉足到后台服务器程序开发领域了。一般的,在安装好node.js后,很少有人会直接用JavaScript原生的开发服务器代码,而是会选择一款框架。那么express.js和koa2就是目前比较流行的两款框架了。
他们都可以用 JS 快速的开发出 API 程序,也都能通过安装其他的模块实现与后台数据库的连接。我个人在多年的编程经历中,面对中小型的项目,对性能要求不高的时候,都会考虑使用这两个框架。一般会很快的写好 Restful API 程序和数据库的CRUD程序。另外部他们两个的部署也比较方便,Linux上装好node.js,然后服务器程序文件放在一个地方,用 pm2 这种基于 node.js 的命令工具启动即可向前端提供服务了。
这两个框架其实是同一班人的作品。express.js问世的较早,koa2其实是express.js的改进,代码更加精炼紧凑,都是不错的选择。
编程语言:Java
聚光灯照顾来,欢呼尖叫响起,superstar 到来了。没错,spring是这几年服务器开发框架里的明星。基于Java这几十年的稳健发展,已经有了太多的处理各种问题和需求的Java第三方包。再结合spring的优良品质,比如常见的权限控制、Restful API 开发、SQL/NoSQL 数据库操作这种常见的功能以外,还可以想象一下利用spring结合hadoop生态来开发big data 应用,那会是另外一片天空了。
我个人在2020年指导了几个本科大学生的毕业设计项目。他们告诉我,他们的老师不仅要求他们写论文,还需要他们开发一个完整的Web项目,要有网站、服务器,后面还要挂个数据库。值得注意的一点是,导师们要求他们必须用spring框架实现服务器。这些学生当然连前端三剑客 HTML/CSS/JavaScript 都还没有玩会,后台抽象的代码更是小白一个。他们说导师也只是知道有这种技术,但是也没法完全指导他们,所以我就有了雪中送炭的机会。
另外,现在很多中大型网站的后台的主要业务逻辑,就是用java的spring来实现的,并结合其他技术向外提供服务。比如国内的一些电商平台就是这样的设计。
上面我只是列举了几个典型的方案,其实还有很多,我基本上都玩过。比如 hapi(JavaScript)、Golang(Go)、Slim(PHP)等等。大家可以根据自己的需求和实际情况,了解这些框架后进行选择。
和择偶很类似,选择适合的才是明智之选。大家都说她好,包括你的父母都很欣赏那个人,但是你就是不喜欢。所以强扭的瓜不甜。下面是几条选择框架的方针,供大家参考:
送给大家一句话:
择偶时,没有最好的,只有合适的。选择框架也是一样的 !
歌Chrome产品管理主管阿弗尼?沙哈(Avni Shah)今天在I/O开发者大会上发布了新版Chrome,该产品将出现于名为Android L的新一代Android系统版本上。
与预期一样,新版Chrome进行了一些功能升级。不过它并不只是进行了改进。对于它,谷歌还传达了一个清晰而意义深远的信息。该公司想要融合原生应用与网页标签。原生应用的终结可能比我们想象得还要快。
在Android L中,经过重新设计的应用切换器与iOS 7上的Safari非常相似。它会在某种卡片抽屉中显示你最近打开过的应用。同时它也显示原生应用以及活跃网页标签。每一个网页标签都有着与应用同等的价值。这是件大事。
同样地,谷歌将其应用索引API(应用程序接口)扩展至所有的Android应用。在此之前,该公司就与特定的几家公司展开了相关合作。例如,在谷歌搜索电影,搜索结果中会出现一个可直接打开IMDb应用中相关电影页面的深度链接。这是一种从网页到原生应用的无缝过渡。
了解这些后,不妨想象一下Android L会变成什么样子。打开手机,在主屏幕上用谷歌语音搜索某样东西,接着Chrome打开,点击第一个搜索结果,你就可以打开原生应用。你可以转到应用上阅读你之前在Chrome上看到过的这篇文章。
在这一过程中,网页应用与原生应用之间反复来回切换。不久之后,你会察觉不出自己是在网页中还是在原生应用当中。
为什么说这一变化有意义呢?谷歌一直以来都是以网页开发为先。该公司最早是通过它的搜索引擎取得成功。不过它之后的热门产品很多都是网页应用,如Gmail,Google Calendar日历,Google Drive。谷歌可能仍然是网页应用开发领域的王者。
而更重要的是,谷歌的大部分收入还是来自网页广告。该公司希望人们更长时间地呆在web上,从而看到更多的谷歌广告。这一点在下一份季度财报中还不会发生改变。
因此,不管是从技术还是从业务角度来看,谷歌的未来都维系在web上。有几位HTML5和网页开发倡导者认为,Android最终可能会成为基于网页应用的操作系统。这实际上也意味着原生应用的终结。
数家公司在这方面展开过尝试——推WebOS的Palm和打造Firefox OS的Mozilla。它们都以失败而告终,原因有多个方面——当时的系统级芯片还不够强大,网页运行不够高效,它们的网页开发者不够出色。
最主要的原因还是时机问题。而谷歌这个适合步步为营地向这种新的应用模式转型则并无不妥。现在的系统级芯片可能能够运行功能齐备的笔记本电脑。谷歌一直在不知疲倦地改进JavaScript和HTML渲染引擎。当然,谷歌麾下也有成千上万优秀的网页开发者。
推广网页应用是个漫长的过程,可能要耗时数年。不过谷歌今天的行动可以说是明确向这一方向迈出的第一步。(译:羽腾)
/ Google Android NDK 技术负责人 Dan Albert
最新版本的 Android 原生开发工具包 (NDK) Android NDK r16 Beta 1 现在可以下载了:
https://developer.android.google.cn/ndk/downloads/index.html
也可以通过 Android Studio 在 SDK 管理器中获取此版本。
NDK r16 对我们来说是一个重大的里程碑,因为它是我们准备建议用户开始迁移到 libc++ 的第一个版本!我们会在后面提供更多信息。
我们还更新了 libc++ 及其相关项目,因此,这个版本提升了对 C++1z 的支持。请注意,在 C++1z 成为 C++17 之前,包含的任何内容都有可能发生变化。
您可以在此处查看该版本的版本说明:
https://android.googlesource.com/platform/ndk/+/ndk-release-r16/CHANGELOG.md
NDK 有一个名为 libandroid_support 的库,这个库可以向后移植 libc++ 依赖、但旧版本不支持的 libc API。我们至今无法认可 libc++(在 NDK 中实现)的原因仍然是对这个库缺乏信心。r16 的焦点是重新编写了这个库,以获得更高的稳定性。
由于 libandroid_support 现在是一个比较小的库,您的应用的行为应当更接近系统的行为。例如,libandroid_support 之前包含对部分 stdio 的替代实现。尽管一些功能向后移植到 ICS,不过,这也意味着替代实现中的任何错误都会出现在自从您的应用引入错误以来发布的 所有 OS 版本中。
在新版本的 libandroid_support 中,我们已将替代实现移除,因此您在较旧的设备上将无法使用某些功能(几乎是一些没人使用的功能,例如格式字符串中的 %a 支持),不过由于没有这些功能,您使用 libc++ 的应用将变得更小、更可靠。
所以,为什么您应转到 libc++ 呢?首先,其他 STL 今后将不再受支持。我们一直将 libc++ 用于自 Lollipop 以来的 Android 平台,有一项变化让我们的工程师感到非常兴奋。我们在平台中比在 NDK 中更早地完成了这种过渡,因为我们不需要 libandroid_support,并且可以仅更新 libc。
与 NDK 中当前可用的其他 STL 相比,libc++ 完全支持 C++11、C++14 和大多数的 C++1z!Stlport 自从 2008 年以来就没有更新过了,gnustl(我们对 GNU 的 libstdc++ 的叫法,这是为了避免与 Bionic 的 libstdc++ 混淆,后者不是一种 STL)一直以来都不是很适合 Clang,尤其是在与 和 之类的编译器内建函数紧密关联的标头中,更是如此。
我们很有可能让 libc++ 成为下一个 NDK 版本的默认选择,但是现在,如果您还没用过,可以按照下面的说明操作,选择启用这种库。
像其他 STL 一样,libc++ 同时提供静态库和共享库。使用哪一个取决于您的具体情况,但是如果您的应用中有且仅有一个共享库,tl;dr 将使用静态版本,并在所有其他情况下使用共享版本。
ndk-build
将以下内容添加至您的 Application.mk 文件中:
APP_STL :=c++_shared
CMake
调用 CMake 时请粘贴以下内容:
-DANDROID_STL=c++_shared
如果您正在通过 Gradle 使用 CMake,请将以下内容添加至您的 build.gradle 中:
externalNativeBuild { cmake { arguments "-DANDROID_STL=c++_shared" } }
独立工具链
在创建独立工具链时,请传递 --stl=libc++。
如果您已经阅读我们的路线图:
https://android.googlesource.com/platform/ndk/+/master/docs/Roadmap.md
想必了解我们计划扩展 libandroid_support 以向后移植尽可能多的 libc/libm。每次跟大家说到这个问题,我们最多只是收到冷淡的回应。考虑到大家看起来不感兴趣,而且这样做也会让库增大(进而导致 APK 增大,这是每个人都非常感兴趣的话题),我们不再打算扩展。
如果我们误解了您的回应,或者您还没有回应我们,并且希望我们扩展,请告诉我们:
https://github.com/android-ndk/ndk/issues/456
tl;dr:如果您想要保留旧 NDK 中的行为,请不要设置 _FILE_OFFSET_BITS=64。
在 NDK 中设置 _FILE_OFFSET_BITS=64 一直都没什么用。此功能在弃用的标头中已经移除。对于统一标头,NDK 现在具有支持此功能的最新标头。
您可以在您的应用中定义 _FILE_OFFSET_BITS=64 宏,以便在 32 位代码中获取对 64 位 off_t 的支持。将 off_t 设为 64 位(默认情况下,它在 32 位代码中为 32 位)和使用 lseek64 调用隐式替换对 lseek 之类 API 的调用可以实现这种支持。
之前版本的 Android 没有添加对 _FILE_OFFSET_BITS=64 的支持。lseek64 这个 API 一直在 bionic 中。大多数 API 在 Lollipop 中添加,其他的一些 API 则到后期版本才添加。
如果您针对的版本不支持正在使用的某个函数的 64 位 off_t 变体,并且已设置 _FILE_OFFSET_BITS=64,该函数将不可用。这与 r15 和 r15b 的行为不同(但与 r15c 的行为一致),在这两个版本中,函数使用 32 位 off_t 错误公开,将被静默截断。
请注意,即使没有不同名称的 _FILE_OFFSET_BITS=64,64 位 off_t API 仍然可用。例如,请调用 lseek64,而不是 lseek。使用 off64_t,而不是 off_t。
最后,由于此功能对具有统一标头的 NDK 来说是一项新功能,如果您只想返回到统一前的标头行为,您要做的只是停止设置 _FILE_OFFSET_BITS=64。
如需了解有关 bionic 中 off_t ABI 详细信息的更多信息,请参阅 Bionic 32 位 ABI 错误文档:
https://android.googlesource.com/platform/bionic/+/master/docs/32-bit-abi.md
查看更多文章,请关注『谷歌开发者』官方微信公众号
*请认真填写需求信息,我们会在24小时内与您取得联系。