awonderphp / notreallypsrresourcemanager
一个关于网络应用JS/CSS资源管理器的提案
Requires
- php: ~7.1.0 || ~7.2.0
Requires (Dev)
- squizlabs/php_codesniffer: 3.*
- vimeo/psalm: ^0
This package is not auto-updated.
Last update: 2024-09-18 05:51:00 UTC
README
这是一个PHP库可以使用的接口集合,用于提供网络应用中使用的第三方JavaScript和CSS资源的合理管理。
当前的命名空间 \AWonderPHP\NotReallyPsrResourceManager
很糟糕,将会更改。它从未打算作为永久命名空间。我希望能有一个标准机构想要采用这个想法,并创建一些带有花哨术语的标准接口,包括 RFC 2119。
虽然不是强制性的,但强烈建议实现这些接口的类扩展 \AwonderPHP\FileResource
命名空间内的抽象类。
这使得生成的对象可以被任何了解如何服务 FileResource
对象的类所服务。
还打算通过本文档中描述的方式从JSON配置文件生成JavaScriptResource和CssResource对象。
FileResource 方法
JavaScriptResource 接口方法
CssResource 接口方法
ResourceManager 接口
JSON配置文件
JavaScript JSON
CSS JSON
文件系统和配置文件命名
包装脚本
FileResource 方法
这些方法在 JavaScriptResource
和 CssResource
接口中指定,并且与抽象 \AwonderPHP\FileResource\FileResource
类中同名方法相同
-
public function getMimeType()
返回$mime
属性。 -
public function getChecksum()
返回$checksum
属性。 -
public function getCrossOrigin()
返回$crossorigin
属性。 -
public function getFilePath()
返回$filepath
属性。 -
public function validateFile()
如果$checksum
属性已设置 并且$filepath
属性已设置 并且 文件存在,则如果文件与校验和匹配,返回true
,如果不匹配,返回false
。 -
public function getSrcAttribute($prefix = null)
构建嵌入资源到网页所需的src
或href
属性的内容。注意,如果$urlscheme
属性为http
并且文件没有使用$validIntegrityAlgo
属性中的算法的$checksum
属性,则将返回null
。可选参数$prefix
是一个文件系统路径,用于在$urlpath
属性之前添加,对于使用包装器提供文件的Web应用程序很有用。 -
public function getIntegrityAttribute()
如果$checksum
属性使用合适的算法,构建integrity
属性的内容。 -
public function getTimestamp()
如果$lastmode
属性不为空,返回UNIX时间戳(自UNIX纪元以来的秒数)。
JavaScriptResource 接口方法
这些方法在JavaScriptResource接口中,但不在之前提到的FileResource
抽象类中定义。
-
getTypeAttribute()
放入<script>
节点type
属性的值。通常是MIME类型,但不总是如此。 -
getAsyncAttribute()
布尔async
属性是否存在。 -
getDeferAttribute();
布尔defer
属性是否存在。 -
getNoModuleAttribute()
布尔nomodule
属性是否存在。 -
generateScriptDomNode($dom, $nonce = null)
创建一个具有可选nonce的\DOMNode
<script>
节点。 -
generateScriptString(bool $xml = false, $nonce = null)
创建一个字符串,可以是HTML或XHTML,用于具有可选nonce的脚本节点。如果$xml
参数为true
,则返回一个符合XML规范的字符串(每个属性都是key="value"
对,布尔属性通常是只是key="key"
,但这并不重要。脚本节点是自闭合的)。当$xml
参数为false
时(默认值),生成一个符合HTML规范的字符串(布尔属性可能只是key
,并且不需要有="value"
,并且自闭合的脚本标签不被认为是闭合的,所以需要一个闭合的</script>
)。
两个generateScriptDomNode()
和generateScriptString()
方法都应该调用getSrcAttribute()
方法,所以实现类的构造函数应该有一个默认为null
但可以由构造函数设置的$prefix
属性。
CssResource 接口方法
-
getTypeAttribute()
CSS<link>
节点的type
属性中包含的内容。这应该始终返回text/css
-
getMediaAttribute()
返回CSS<link>
节点的media
属性中包含的内容。这很少使用,但非常强大,我认为应该更频繁地使用,因为它可以减少客户端成功使用Web应用所需的带宽。 -
getHreflangAttribute()
返回hreflang
属性中包含的内容。当不为null时,它必须是BCP47字符串。 -
getReferrerPolicyAttribute()
返回CSS<link>
节点的referrerpolicy
属性中包含的内容。我怀疑它不会使用很多,但它是存在的。 -
getRelAttribute()
rel
属性的内容,应该返回stylesheet
。
ResourceManager 接口
这是定义Web应用如何交互以获取它们所需的JavaScriptResource
和CssResource
对象的一个接口。
它描述了两个公共方法
-
getJavaScript(string $vendor, string $product, string $name, $version, $variant = null);
-
getCSS(string $vendor, string $product, string $name, $version, $variant = null);
Web应用调用这些方法,这些方法将返回null
,如果实现类无法创建对象,或者根据调用哪个方法返回一个JavaScriptResource
或CssResource
实现对象。
参数
-
$vendor
字符串
小写供应商字符串,用于打包JavaScript或CSS的人,类似于PSR-4 PHP类的第一级命名空间,但小写。在Composer术语中,它将是Composer创建的Web应用vendor
目录中的顶级目录。 -
$product
字符串
小写产品字符串,JavaScript或CSS是其中的一部分,类似于PSR-4 PHP类的第二级命名空间,但小写。在Composer术语中,它将是之前提到的目录。 -
$name
字符串
JavaScript或CSS的名称,不带版本和其他信息,例如jquery
或jquery-ui
或normalize
。 -
$version
字符串或整数
所需的版本,例如3.3.1
以特别要求jQuery 3.3.1或3.3
以特别要求3.3
分支的最新版本,或者简单地3
以要求3分支的最新版本。 -
$variant
字符串或 Null
所需JavaScript的变体,例如min
用于压缩或slim
或slim.min
。
有了这些信息,实现ResourceManager
的类就能够找到描述该对象的JSON文件并将其加载到对象中。
实现类的构造函数应定义资源安装到的Base
目录,以便方法可以找到所需的配置文件,并使用getSrcAttribute()
方法指定$prefix
。
示例用法
$base = "/whatever/path";
$RM = new \namespace\whatever\ImplementingClass($base);
$jsObj = $RM->getJavaScript('flossjs', 'jquery', 'jquery', 3, "min");
然后从$jsObj
,Web应用程序可以创建所需的<script>
节点。
JSON配置文件
ResourceManager将寻找与Web应用程序请求的资源匹配的JSON配置文件,然后根据JSON文件创建要返回的对象。这需要一个标准的JSON文件格式。
JavaScript和CSS的常见JSON元素
name
字符串,必需
脚本或CSS的名称(不带版本和变体),例如jquery
。homepage
字符串,非必需
项目的URL主页version
字符串,必需
所描述脚本的版本。license
数组,必需
包含一个或多个适用于脚本的许可证的数组。数组的每个元素应包含许可证名称和许可证的URL。
这些字段不被类使用,但是对系统管理员有用的元数据。JS和CSS的通用字段
mime
字符串,必需
在提供文件时应使用的MIME类型。checksum
字符串,推荐FileResource
抽象类中描述的algo:checksum
。filepath
字符串,可选
如果文件在服务器上存在,则文件系统路径到该文件。lastmod
字符串,推荐
可以被strtotime()
解析的字符串,以创建表示文件最后修改时间的UNIX时间戳。对于许多项目,这个字符串指定在文件的注释标题中,在这些情况下,应使用该字符串。srcurl
字符串,必需
应放在src
或href
属性中的内容。必须由parse_url
函数解析,并且国际化域名应使用punycode。minified
布尔值,可选
此字段的用途可能被某些实现使用,但不是必需的。它定义了文件中的JS/CSS是否被压缩。
JavaScript JSON
JavaScript JSON的示例
{
"name": "jquery",
"homepage": "https://jqueryjs.cn/",
"version": "3.3.1",
"license": [
{
"name": "MIT",
"url": "https://jquery.org/license/"
}
],
"mime": "application/javascript",
"checksum": "sha256:160a426ff2894252cd7cebbdd6d6b7da8fcd319c65b70468f10b6690c45d02ef",
"filepath": "flossjs/jquery/js/jquery-3.3.1.min.js",
"lastmod": "2018-01-20T17:24Z",
"minified": true,
"srcurl": "/js/jquery-3.3.1.min.js"
}
JavaScript特定字段
async
布尔值,可选
只有在需要该属性时才需要,然后设置为true
。defer
布尔值,可选
只有在需要该属性时才需要,然后设置为true
。nomodule
布尔值,可选
只有在需要该属性时才需要,然后设置为true
。- ??
type
?? 需要探索
在大多数情况下,将type
属性设置为MIME类型,但可能需要将其设置为modular
以用于ES6模块功能,我还需要学习这方面的知识。
CSS JSON
CSS JSON的示例需要编写。
CSS特定字段
media
数组,可选
包含CSS文件应用的媒体类型的数组,当它不适用于所有人时(浏览器在没有指定时假定all
)hreflang
字符串,可选
适用于CSS文件的BCP47语言字符串。referrerpolicy
字符串,可选
当存在时,必须是以下之一:no-referrer
、no-referrer-when-downgrade
、origin
、origin-when-cross-origin
、unsafe-url
-- 浏览器假定no-referrer-when-downgrade
是CSS样式表的最好策略。我认为unsafe-url
绝对不应该使用,因为它可能会泄露信息。它只在远程服务器不使用TLS但您的Web应用程序使用TLS的情况下才有意义,并且这种情况应该由浏览器阻止。
文件系统和配置文件命名
所有脚本都应该按照$base/VendorName/ProductName
的层次结构安装,其中VendorName
和ProductName
都是小写,这与PHP库的Composer约定一致。
在Composer安装JS/CSS库的情况下,Composer的vendor
目录将是$base
目录。
在ProductName
目录中,必须存在一个包含JSON配置文件的etc
目录,并且建议实际的JavaScript文件位于js
目录中,CSS文件位于css
目录中。
以下是一个示例:AliceWonderMiscreations/CommonJS
默认配置文件命名使用
ScriptName-Version-Variant.json.dist
其中ScriptName是脚本的名称(例如jquery
),Version是脚本的版本(例如3.3.1
),如果存在,Variant将是脚本的变体(例如min
或slim
或slim.min
)。
默认配置应该将srcurl
指向本地URL,例如
"srcurl": "/js/jquery-3.3.1.min.js",
当系统管理员想要自定义配置中的内容时,他们只需复制文件,使其不再以.dist
结尾,然后就可以修改它(例如将srcurl
设置为CDN)。
ResourceManager在找到时必须优先使用不带.dist
的配置文件。
使用major.minor.point
版本方案,应存在一个配置文件,用于匹配最新的major.minor.point
的major.minor
和major
,并且与默认配置文件相同。
包装脚本
实现此功能的Web应用程序必须能够处理对默认的/js/
和/css/
位置的请求。
这可以通过包装脚本实现。已经编写了一个扩展FileWrapper类的抽象类,该抽象类是AWonderPHP\FileResource
命名空间的一部分。
此命名空间中存在一个接口,可用于定义一个扩展上述FileResource
对象的类的类。
EOF