dimadin / commonwp
将开源静态资源卸载到免费、公共CDN
Requires
- php: >=5.4
- composer/installers: ~1.0
- dimadin/backdrop: ^1.0
- dimadin/wp-temporary: ^1.0
This package is auto-updated.
Last update: 2024-08-28 10:16:38 UTC
README
commonWP是一个插件,允许使用免费的CDN来使用开源的JavaScript和CSS文件。它旨在既轻量又非常安全。
使用方法
安装commonWP有三种方式
- 您可以从WordPress.org 插件仓库获取稳定版本。
- 您可以在项目中要求
dimadin/commonwp
包。 - 您可以克隆此存储库,然后运行
composer install
。
激活后,没有任何设置。它将在后台填充其缓存,这可能会根据网站使用的资源数量而花费一些时间。
您可以使用以下列出的WordPress钩子更改一些默认的commonWP设置。
常见问题解答
- 哪些文件可以重写?
- WordPress核心的所有文件,除非您使用WordPress的开发版本。
- WordPress.org插件仓库托管的所有插件文件,除非特定插件的作者没有使用SVN标签来发布。
- WordPress.org主题仓库托管的所有主题文件。
- 支持GitHub Updater的GitHub上托管的插件和主题的所有文件。
- 任何类型主题、插件或MU插件的任何标记为可在npm中使用的文件。
- 为什么选择jsDelivr?
- jsDelivr是一个公共、开源CDN,对所有用户免费,没有带宽限制,专注于性能、可靠性和安全性,用于生产。它具有多级故障转移,全球有数百个节点,在中国大陆有直接位置,由中国政府颁发的有效ICP许可证。产品成熟,自2012年起运营。所有文件都通过HTTPS和HTTP/2传输,它们使用HTTP头部进行长缓存(包括不可变的HTTP头部),在某些位置甚至使用Brotli压缩传输。
- commonWP是否支持多站点?
- 是的,它支持。
- commonWP是否兼容Bedrock?
- 是的,它支持。
- 这有多安全?
- 本插件采用的方法比任何其他允许使用CDN的插件都更安全。首先,commonWP只会重写文件,将其指向jsDelivr上的一个文件,前提是远程文件与本地文件完全相同。其次,在比较过程中,commonWP生成远程jsDelivr文件的子资源完整性哈希,并将该哈希包含在页面源代码中,这样浏览器就不会加载没有完全相同哈希的远程文件。如果由于jsDelivr(或您怀疑可能由commonWP引起的任何问题)的原因,您的网站无法按预期显示页面,您可以像禁用其他插件一样简单地禁用commonWP。它不会对您的数据库或文件造成永久性更改,除了缓存可以重写到数据库的文件路径外,但在插件停用时,它会智能地删除该缓存。
- 开始使用commonWP后,我的网站速度会更快吗?
- 有几个因素会影响速度以及您可能会获得的访问者数量。
- 您有多少文件可以在jsDelivr上找到并可重写。jsDelivr上的文件越多,速度越快;页面使用的文件重写到jsDelivr的越多,速度越快。
- 您的网站访问者距离您的网站托管服务器越远,他们获得的速度就越快。
- 您的服务器越慢,他们获得的速度就越快。
- 如果您的访问者已经访问过启用了commonWP的WordPress网站,那么他们更有可能已经缓存了您网站上的一些文件,因此他们会获得更多的速度。
- 有几个因素会影响速度以及您可能会获得的访问者数量。
- 除了速度之外,还有其他好处吗?
- 使用公共CDN有间接好处。例如,几乎所有的WordPress网站前端都使用
jquery.js
、jquery-migrate.min.js
、wp-embed.min.js
、wp-emoji-release.min.js
文件。这些文件在每个网站上都是相同的,但它们为每个网站分别分发。这意味着即使您已经在浏览器缓存中有了这些文件,您仍然会一次又一次地下载相同的文件。现在想象一下,如果这些文件不是分别分发的,而是为每个网站从同一位置分发。现在,您只需下载一次文件,每次访问另一个网站时,您都会从浏览器缓存中使用它们。这意味着这些网站会更快地加载(您不再下载相同的文件),使用更少的数据(为网站支付的带宽更少,从您的数据限额中使用的数据更少),在浏览器缓存中使用的空间更少(这可以用于缓存其他东西),对他们的服务器造成的负载更少(所有这些使事情更加节能)。这就是commonWP背后的想法。由于WordPress网站使用的文件大多都是开源的(这意味着可以在公共CDN上找到),为什么不从中央位置分发它们并享有上述所有好处呢?(这就是名字的由来:Common WordPress。)
- 使用公共CDN有间接好处。例如,几乎所有的WordPress网站前端都使用
- 如果我已经使用CDN了怎么办?
- commonWP将尝试重写存在于jsDelivr上的文件。对于其他文件,您将回退到您使用的CDN。这仅在您使用的CDN插件在commonWP之前运行时才有效。
- 如果我使用Autoptimize或其他插件进行自动连接或压缩怎么办?
- 如果该插件在commonWP之前没有运行,您将自动连接或压缩commonWP未重写的文件。
- 我可以配置哪些选项?
- UI中没有,尽管如果您需要,可以通过WordPress过滤器配置几个设置。这仅适用于了解自己在做什么的开发者。以下是一些示例,并查看完整的代码参考http://api.milandinic.com/commonwp/。
- 关于隐私和GDPR怎么办?
- 通过使用commonWP,您网站页面上的某些文件将从 jsDelivr 加载。使用jsDelivr CDN的隐私政策在 https://www.jsdelivr.com/privacy-policy-jsdelivr-net。该页面提供了关于他们数据处理详细的信息。
标记存在于npm中的文件
您在主题或插件中使用的某些外部库可能也存在于npm上。首选使用jsDelivr上的/npm
路径重写,并标记这些文件为npm上可用。这同样适用于您自定义或付费的插件/主题。
您需要知道的是,您使用哪种方式在WordPress中注册了该文件,以及您需要知道npm包的名称和从包根目录到文件的路径(包括文件名,但不包括扩展名)。JavaScript和CSS文件使用不同的过滤器。在两种情况下,您都通过依赖项处理键和该文件在npm上的设置数组来扩展默认数组。
在这个例子中,我们将使用Bootstrap文件,并标记给commonWP,它们在npm上可用。
add_action( 'wp_enqueue_scripts', function() { // Use the .min version if SCRIPT_DEBUG is turned off. $min = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min'; wp_enqueue_script( 'popper.js', get_template_directory_uri() . "/assets/js/popper{$min}.js", [], '1.14.0', true ); wp_enqueue_script( 'bootstrap', get_template_directory_uri() . "/assets/js/bootstrap{$min}.js", [ 'jquery', 'popper.js' ], '4.1.0', true ); wp_enqueue_style( 'bootstrap', get_template_directory_uri() . "/assets/css/bootstrap{$min}.css", [], '4.1.0' ); } ); add_filter( 'npm_packages_scripts', function( $scripts ) { // For file: https://cdn.jsdelivr.net.cn/npm/bootstrap@4.1.0/dist/js/bootstrap.min.js $scripts['bootstrap'] = [ // This is the handle used when script is registered in WordPress. 'package' => 'bootstrap', // Slug of npm package. 'file' => 'dist/js/bootstrap', // Path to file, excluding extension (it is always either .js or .css). 'minified' => '.min', // If file has both minified and unminified version, and if simple suffix can be added to the base. ]; // For file: https://cdn.jsdelivr.net.cn/npm/popper.js@1.14.0/dist/umd/popper.min.js $scripts['popper.js'] = [ 'package' => 'popper.js', 'file' => 'dist/umd/popper', 'minified' => '.min', ] return $scripts; } ); add_filter( 'npm_packages_styles', function( $styles ) { // For file: https://cdn.jsdelivr.net.cn/npm/bootstrap@4.1.0/dist/css/bootstrap.min.css $styles['bootstrap'] = [ 'package' => 'bootstrap', 'file' => 'dist/css/bootstrap', 'minified' => '.min', ]; return $styles; } );
请注意,您本地的文件和远程文件必须相同,否则commonWP不会使用远程文件,也不会进行重写。为了确保文件相同,您可以从npm包中获取本地目录的文件。
另外,请注意,当使用过滤器时,您不应该使用文件扩展名,并且不应该输入包版本(但您应该在注册依赖关系时输入正确的文件版本)。
如果您没有本地开发版本,可以跳过minified
键,只需将.min
追加到file
的值。
使用这些过滤器是安全的,因为它们仅在commonWP使用时触发。
启用对象缓存时使用commonWP
默认情况下,commonWP将其数据存储在标准选项值中。如果您启用了对象缓存,可以跳过数据库并直接使用对象缓存。除了没有数据库调用外,这还在单站点安装上减少了自动加载的选项缓存的大小。
在这个例子中,使用了transients函数,因为当启用对象缓存时,transients不使用数据库。使用网络transients是因为它们在多站点安装上使用全局缓存组。
add_filter( 'commonwp_store_callback', function( $function, $base ) { if ( 'update' === $base ) { $base = 'set'; } return $base . '_site_transient'; }, 10, 2 );
如果您开始使用这种方法,请停用commonWP插件,添加此代码,然后再次激活,或者在多站点安装中通过其他方式删除选项commonwp_data
(这是一个网络选项)以减少自动加载的选项缓存的大小。
决定是否应重写路径
可以通过使用过滤器避免重写某些文件路径。这些路径将完全不被处理,因此数据库中不会产生缓存。例如,可以用于已知在jsDelivr上没有相应文件(即使是在/npm
路径上)的自定义或付费插件/主题。
add_filter( 'commonwp_should_rewrite', function( $rewrite, $relative_path, $src, $handle, $type ) { if ( false !== strpos( $src, '/wp-content/plugins/my-custom-plugin' ) ) { return false; } return $rewrite; }, 10, 5 );
在存储查找之前返回路径
您可以在接触commonWP存储或进行常规处理之前返回远程文件路径。例如,MU插件中使用的某些文件可能存在于自定义GitHub存储库中,您可能想使用它。
add_filter( 'commonwp_get_src', function( $pre, $relative_path, $src, $handle, $type ) { return \Some\Custom\Function( $relative_path ); }, 10, 5 );
缓存过期
当commonWP看到新文件时,它将在后台任务中处理该文件,以查看jsDelivr上是否存在相同的副本。该处理的结果被缓存,以便下一次commonWP可以立即知道是否应该重写。每个文件路径的缓存过期时间(TTL)根据处理结果和文件类型而不同,可以使用过滤器进行更改。
commonwp_npm_path_ttl
- 对于在/npm
路径上可用的文件。默认为一周。commonwp_emoji_npm_path_ttl
- 对于在/npm
路径上可用的emoji目录。默认为一周。commonwp_plugin_path_ttl
- 对于在/wp/plugins
路径上可用的文件。默认为一天。commonwp_theme_path_ttl
- 对于在/wp/themes
路径上可用的文件。默认为三天。commonwp_github_path_ttl
- 对于在/gh
路径上可用的文件。默认为两天。commonwp_inactive_path_ttl
- 对于不在jsDelivr上的文件。默认为一天。commonwp_inactive_path_ttl_for_recently_upgraded_core
- 对于WordPress核心文件,在WordPress核心最近升级后不在jsDelivr上。默认为15分钟。
暴露私有细节
由于jsDelivr的工作方式,如果文件不是从/npm
路径加载的,它会在文件的完整路径中显示核心、插件或主题的确切版本。这并不是问题,因为版本可以通过其他方式被发现。如果核心、插件或主题有可用的更新,您可以告诉commonWP不要缓存该核心、插件或主题的文件的安装版本路径,而是使用它们的最新版本。请注意,这并不能保证您的站点安全,您只是不会在jsDelivr URL中显式显示安装的版本,但这并不意味着您不会在其他地方显示版本。您仍然应该保持核心、插件和主题的最新状态,并在它们可用时升级到新版本。另外,请注意,由于缓存可能持续长达两天,因此jsDelivr URL仍可能被使用,从而显示版本。
当有更新可用时,可以通过类型在URL中使用最新版本缓存路径。通过传递带有\dimadin\WP\Plugin\commonWP\Process
对象的参数来执行此操作,因此文件名、主题或插件。如果文件被标记为可在npm上找到,则此操作将没有效果。
对于核心文件,有两个过滤器:一个用于您有最新版本在您的分支上但有新分支可用(主要),另一个用于您不使用分支上的最新版本(次要)。
add_filter( 'commonwp_process_core_with_major_update', '__return_false' ); add_filter( 'commonwp_process_core_with_minor_update', '__return_false' ); add_filter( 'commonwp_process_plugin_with_update', '__return_false' ); add_filter( 'commonwp_process_theme_with_update', '__return_false' );
重写远程副本与本地副本不相同的文件
虽然将不相同的远程文件重写到本地文件听起来不合逻辑,但确实存在一些有效的情况。
例如,WordPress核心中使用的某些库不提供开发版本。这意味着它不会重写到npm上可用的开发版本,而是重写到相同的、压缩过的版本。或者,当npm包中的压缩版本使用与本地版本不同的工具进行压缩时,文件就不相同了。
您可以使用过滤器重写到那些远程文件,即使比较失败。请注意,这仅适用于标记为可在npm上找到的文件,并且默认情况下不会发生,您必须通过过滤器启用它。另外,请注意,在触发此钩子之前,远程文件必须存在。
add_filter( 'commonwp_npm_compare_with_local', function( $compare, $process ) { if ( ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) && 'script' == $process->type ) { switch ( $process->handle ) { case 'jquery-core' : case 'underscore': case 'backbone': $compare = false; break; } } return $compare; }, 10, 2 );
禁用子资源完整性
如果您确信jsDelivr不会被泄露,并且您想减小页面大小,您可以选择全局或按文件禁用子资源完整性。
全局
您可以移除脚本、样式或两者。
add_action( 'plugins_loaded', function() { remove_filter( 'script_loader_tag', [ 'dimadin\WP\Plugin\commonWP\SRI', 'script' ], 567, 3 ); remove_filter( 'style_loader_tag', [ 'dimadin\WP\Plugin\commonWP\SRI', 'style' ], 567, 3 ); }, 15 );
按文件
add_filter( 'commonwp_add_subresource_integrity', function( $enable, $process ) { if ( 'jquery-core' == $process->handle ) { return false; } return $enable; }, 10, 2 );
WP-CLI
commonWP实现了以下命令
wp commonwp clean
从commonWP存储中删除。
wp commonwp clean all
删除commonWP使用的所有数据。
wp commonwp clean all
示例
$ wp commonwp clean all
commonWP data was deleted.
wp commonwp clean expired
删除已过期的路径。
wp commonwp clean expired
示例
$ wp commonwp clean expired
Expired paths were deleted.
wp commonwp clean starting-with
删除以请求路径开始的路径。
wp commonwp clean starting-with <path>
选项
<path>
Path that paths should start with.
示例
# Delete paths that are from /wp-admin folder.
$ wp commonwp starting-with /wp-admin
Paths that start with /wp-admin were deleted.
wp commonwp paths
获取存储的路径数据。
wp commonwp paths list
列出所有类型的路径。
wp commonwp paths list
示例
$ wp commonwp paths list
wp commonwp paths list active
列出可重写的路径。
wp commonwp paths list active
示例
$ wp commonwp paths list active
wp commonwp paths list inactive
列出未重写的路径。
wp commonwp paths list inactive
示例
$ wp commonwp paths list inactive
wp commonwp paths list queue
列出应该处理的路径。
wp commonwp paths list queue
示例
$ wp commonwp paths list queue
wp commonwp queue
处理队列路径。
wp commonwp queue process
处理所有等待路径。
wp commonwp queue process
示例
$ wp commonwp queue process
Queue was processed.