ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Play 2.3 新特性全解析:Activator、sbt-web 资产管线、Java 8 与 WS 独立化

Play 2.3 新特性全解析:Activator、sbt-web 资产管线、Java 8 与 WS 独立化 后端Web框架【免费下载链接】playframeworkThe Community Maintained High Velocity Web Framework For Java and Scala.项目地址https://gitcode.com/gh_mirrors/pl/playframework点击查看免费下载Play 2.3 是 Play Framework 演进史上承上启下的一个重要版本它以 Activator 取代play命令、引入 sbt-web 资产管线与资源指纹识别、正式支持 Java 8、实现 Scala 2.10/2.11 交叉构建并将 WS 客户端拆分为可独立使用的库。本文以官方 Highlights23.md 为主线结合当前仓库中的源码与配套文档逐项梳理这些新特性的用法、配置与底层实现帮助读者完整掌握从 Play 2.2 升级到 2.3 所需了解的全部能力与迁移要点。Activatorplay命令进化成activator命令Play 2.3 中最直观的变化是启动命令从play变成了activator。Play 全面改用 Activator一个围绕 sbt 的封装与增强层主要出于三个目标扩展项目模板生态Activator 支持远比 Play 原有模板更丰富的模板库模板还可以内置教程与上手资源社区也能贡献模板提供 Web UI 上手体验尤其对不熟悉命令行的新手可以通过activator ui启动的网页界面直接编写代码、运行测试熟练用户仍可使用原有命令行让 Play 的高效开发模式惠及其他项目Activator 不限于 Play其他项目同样可以使用。Activator 命令原先play命令具备的能力在activator中全部保留activator new创建新项目详见 NewApplication.mdactivator进入控制台REPL/开发环境详见 PlayConsole.mdactivator ui2.3 新增启动一个网页版用户界面。注意activator与旧play命令本质都是 sbt 的封装。如果更习惯 sbt也可以直接使用sbt命令但会失去activator new模板与activator uiWeb UI等 Activator 独有功能。test、run等常规控制台命令在三者中均可使用。Activator 发行版Play 2.3 以 Activator 发行版的形式分发该发行版内含 Play 的全部依赖可从 Play 官方下载页获取。如果只想用精简方案也可下载约 1MB 的 Activator mini 发行版——它只在需要时才按需下载依赖。由于 Activator 只是 sbt 的封装直接下载并使用 sbt 同样可行。构建体系改进sbt-web、Auto Plugins 与资产指纹sbt-web把前端资产处理从 Play 核心中解耦Play 2.3 最大的新特性是引入 sbt-web。它把 HTML、CSS、JavaScript 相关的处理能力从 Play 核心中剥离出来形成一族纯 sbt 插件。这带来两大好处Play 对 HTML/CSS/JavaScript 的技术选型不再强绑定、更少固执己见sbt-web 可以拥有独立社区与 Play 并行发展。sbt-web 插件可以在 JVM 内通过 Trireme 运行也可以使用本机 Node.js 运行。默认使用 Trireme若安装了 Node.js 并希望获得更快的构建速度可通过 sbt 的SBT_OPTS环境变量指定 JS 引擎export SBT_OPTS$SBT_OPTS -Dsbt.jse.engineTypeNodesbt-web 不关心目录叫javascripts还是stylesheets任何放在app/assets下、扩展名匹配的文件都会被纳入处理。另一个重要约定是所有资产最终都从public目录对外提供。如果之前在public之外放置资产旧配置playAssetsDirectories迁移后应改为unmanagedResourceDirectories in Assets baseDirectory.value / foo注意这些目录下的文件会被聚合进目标public目录同名文件会相互覆盖foo/a.js会覆盖public/a.js建议使用public下的子目录做命名空间隔离。Auto Plugins 与 sbt 0.13.5Play 2.3 使用 sbt 0.13.5该版本带来 auto plugins 特性大幅减少构建文件中的配置样板代码。旧版中playJavaSettings/playScalaSettings的声明方式被移除改为通过enablePlugins按需启用插件。当前仓库的 sbt 插件实现中可以看到这一机制的直接体现——Play.scala 中PlayWeb通过override def requires PlayService SbtTwirl SbtJsTask RoutesCompiler声明其依赖的插件集合而PlayMinimalJava、PlayJava、PlayScala等则分别聚合各自的设置项。迁移后的典型构建定义Java 与 Scala 二选一lazy val root (project in file(.)).enablePlugins(PlayJava)或lazy val root (project in file(.)).enablePlugins(PlayScala)旧的play.Project写法也对应迁移为原生 sbtProject加enablePlugins。启用插件后相关设置会自动导入。Play 提供的键需要放进PlayKeys对象中引用例如import PlayKeys._或写成PlayKeys.playVersion。sbt-web 家族插件是按需启用的典型例子只要启用了作为根插件的SbtWeb通过addSbtPlugin添加的 sbt-less 等子插件就会自动生效。Play 2.3 发布时对应的 sbt-web 生态组件版本作为历史事实记录库webdriver1.0.0、jse1.0.0、npm1.0.0sbt 插件sbt-web、sbt-webdriver、sbt-js-engine、sbt-coffeescript、sbt-digest、sbt-gzip、sbt-less、sbt-jshint、sbt-mocha均为 1.0.0sbt-rjs为 1.0.1。资产管线与指纹识别sbt-web 为 Play 带来高度可配置的资产管线例如pipelineStages : Seq(rjs, digest, gzip)上面这行配置会依次执行 RequireJS 优化器sbt-rjs、摘要器sbt-digest与压缩sbt-gzip。与多数 sbt 任务不同管线中的任务会严格按声明顺序逐个执行。顺序是有意义的先优化文件再为它们生成摘要最后对所有结果做 gzip。Play 2.3 的另一项新能力是资产指纹识别fingerprinting原理与 Rails 的资产指纹类似摘要器会把内容哈希写进文件名。配合指纹Play 在提供这些资产时可以使用远期过期far-future的 Cache 响应头浏览器因此能采取更激进的缓存策略用户再次访问时的下载速度会明显加快。stage/dist打包任务产出时rjs 才会真正执行不同于旧版每次构建都执行。rjs 的常用选项包括appBuildProfile项目构建 profile 内容、appDirrjs 读取的源目录、baseUrl相对 assets/public 存放 js 的目录默认取 js、javascripts 或 .、dirrjs 输出目录、optimize优化器名默认 uglify2、webJarCdnsWebJar 的 CDN 映射默认 org.webjars 映射到 jsdelivr等。资产来源WebJars 与 npmWebJars 在 Play 2.3 中承担重要角色只需在构建文件里声明依赖即可引入前端库libraryDependencies org.webjars % bootstrap % 3.2.0WebJar 资产会被自动解压到相对public的lib目录。例如声明了 RequireJS 依赖后可以在视图中这样引用script>// Scala 2.11 scalaVersion : 2.11.1// Scala 2.10 scalaVersion : 2.10.4注意这与旧版行为不同旧版 Play 插件会替你设置scalaVersion2.3 起需要显式声明。Play WS拆分为独立库并强化安全独立库与多客户端WS 客户端库被重构为独立库可以在 Play 之外单独使用。与过去只能使用WS单例不同现在可以创建多个WSClient实例。当前仓库中 WSClient.scala 定义了trait WSClient extends Closeable核心 API 为url(url: String): WSRequest与underlying[T]: T并建议通过依赖注入方式获取实例。Java 用法WSClient client new NingWSClient(config); PromiseWSResponse response client.url(http://example.com).get();Scala 用法val client: WSClient new NingWSClient(config) val response client.url(http://example.com).get()每个 WS 客户端都可配置独立的超时、重定向与安全选项因此不同的 Web Service 可以使用不同的设置。底层AsyncHttpClient对象现在也可以访问从而支持 multi-part 表单与流式 body 上传。在 Scala 项目中若继续使用全局WS需要确保 Play 应用在作用域内通常通过import play.api.Play.current且WS.client返回的是WSClient实例可通过WS.client.underlying拿到底层AsyncHttpClient。迁移时需为 Java 项目添加javaWs依赖并把包名更新为play.libs.ws.*Scala 项目添加ws依赖。完整用法参见 JavaWS.md 与 ScalaWS.md。WS 安全WS 客户端提供全面的 SSL/TLS 配置项详见 WsSSL.md。2.3 起 WS 客户端的默认配置更为安全。Actor WebSockets用 Actor 处理 WebSocket 交互Play 2.3 在 Java 与 Scala 中同时提供了用 Actor 处理 WebSocket 消息的方法。Java 示例public static WebSocketString socket() { return WebSocket.withActor(MyWebSocketActor::props); }Scala 示例def webSocket WebSocket.acceptWithActor[JsValue, JsValue] { req out MyWebSocketActor.props(out) }这种模式由框架自动完成 Actor 与 WebSocket 流之间的桥接框架为每个连接创建 Actor并提供一个用于向上游发送消息的ActorRef。当前仓库 WebSocket.scala 中定义了配套类型type HandlerProps ActorRef Props即给定向上游发送消息的 ActorRef返回用于创建处理 WebSocket 的 Actor 的 Props同文件中还包含accept、acceptOrResult等基于 Pekko StreamsFlow的完整 WebSocket 处理 API。Java 侧对应实现在 WebSocket.java其MappedWebSocketAcceptor提供了Text、Binary、Json等现成消息映射器。详细用法参见 JavaWebSockets.md 与 ScalaWebSockets.md。Results 重构完成Play 2.2 引入了一批新结果类型并弃用了旧类型Play 2.3 完成了这场重构Scala 侧移除了play.api.mvc.PlainResult、ChunkedResult、AsyncResult、Async等 2.1 时代的遗留类型并把SimpleResult正式改名为Result提供已弃用的类型别名以保持源码兼容建议尽快切换到ResultJava 侧移除了play.mvc.Results.async与play.mvc.Results.AsyncResultplay.mvc.SimpleResult更名为play.mvc.Result对大多数 Java 代码透明主要影响Global.java的错误回调和自定义 action。详细迁移指引参见 Migration23.md 的Results restructure一节。Anorm类型安全与 SQL 内插Play 2.3 的 Anorm 在类型安全、option 解析、错误处理等方面做了大量修复并带来新特性字符串内插写 SQLSQLSELECT * FROM table WHERE id $id更少样板、参数处理性能最高提升约 7 倍多值参数SQLSELECT * FROM Test WHERE cat IN (${Seq(a, b, c)})按位置解析列val parser long(1) ~ str(2) map { case l ~ s ??? }查询结果除数据外还包含执行上下文含 SQL 警告支持更多参数与列类型java.util.UUID、数值类型Java/Scala 大数与整数、更多数值间列转换、时间类型java.sql.Timestamp、字符类型。类型安全方面查询参数类型必须可见把Any显式或经类型擦除当作参数值会导致编译错误No implicit view available from Any anorm.ParameterValue若确实需要传递无安全转换的值可用anorm.Object(anyVal)。Pk[A]已弃用查询参数应显式使用Id[A]/NotAssigned或直接用Option[A]Some[A]/None替代。自定义 SSLEngine 用于 HTTPSPlay 服务器现在支持自定义SSLEngine这在需要定制握手行为如客户端证书认证时尤为有用配置方法参见 ConfiguringHttps.md。其他迁移要点速览除上述主题外升级到 2.3 还需注意以下改动详见 Migration23.mdsbt 版本project/build.properties中声明sbt.version0.13.5插件版本改为addSbtPlugin(com.typesafe.play % sbt-plugin % 2.3.XXX)模板引擎独立为 Twirlplay.mvc.Content改为play.twirl.api.ContenttemplatesImport/templatesTypes改为TwirlKeys.templateImports/TwirlKeys.templateFormatsHtml.empty改为play.twirl.api.HtmlFormat.emptySession 超时配置改为时长session.maxAge从秒数整数改为 duration例如1h、30m不带单位时默认按毫秒解析旧值3600从一小时变成3.6 秒必须补上时间单位JUnit 测试父类WithApplication、WithServer、WithBrowser已内置Before方法不再需要手写setUp调用start()需要自定义应用时覆写provideFakeApplication()Session/Flash 隐式参数改名Scala Controller 的隐式session、flash、lang分别更名为request2Session、flash2Session、lang2Session官方建议直接改用RequestHeader上的对应属性内置 Bootstrap field constructor 弃用官方建议改用第三方为特定 Bootstrap 版本定制的模板前端处理组件更替CoffeeScript 选项改为sourceMap默认true与bare默认falseLESS 用includeFilter/excludeFilter声明入口Closure Compiler 被拆分为 JSHint校验与 UglifyJS 2压缩经由 sbt-rjs 提供。小结Play 2.3 以 Activator 重构了开发入口用 sbt-web 重构了前端资产体系并引入指纹缓存同时完成了 Java 8 支持、Scala 2.10/2.11 双版本构建、WS 独立化、Actor WebSockets、Results 收尾、Anorm 强化与自定义 SSLEngine 等一系列改动。对开发者而言最大的迁移成本集中在构建脚本auto plugins、显式scalaVersion、sbt-web 管线、WS 依赖声明与模板引擎包名调整上而收益则是更灵活的前端工具链、更强的 Java 性能与更安全的默认配置。这份变更清单既是 2.3 版本的完整技术画像也是理解 Play 后续版本演进如 sbt-web 生态、WS 持续独立化的重要起点。赞分享后端Web框架【免费下载链接】playframeworkThe Community Maintained High Velocity Web Framework For Java and Scala.项目地址https://gitcode.com/gh_mirrors/pl/playframework点击查看免费下载相关推荐Play Framework 2.4 迁移指南从 2.3 升级到 Java 8、依赖注入与新配置体系Play Framework 2.4 迁移指南从 2.3 升级到 Java 8、依赖注入与新配置体系 本文是 Play Framework 官方 2.4 迁移后端Web框架TensorFlow-Course版本2.3新特性解析TensorFlow Course版本2.3新特性解析 TensorFlow 2.3作为深度学习框架的重要版本更新带来了多项实用功能和性能优化。对于想要快速教程深度学习机器学习Java 8-21新特性终极指南从Lambda到虚拟线程的完整进化史Java 8 21新特性终极指南从Lambda到虚拟线程的完整进化史 Java作为企业级开发的主流语言从2014年的Java 8到2023年的Java 21文档教程后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表