dimadin/commonwp

将开源静态资源卸载到免费、公共CDN

安装: 41

依赖关系: 0

建议者: 0

安全: 0

星标: 35

关注者: 6

分支: 7

类型:wordpress-plugin

1.1.0 2018-12-27 19:46 UTC

This package is auto-updated.

Last update: 2024-08-28 10:16:38 UTC


README

Build Status Latest Stable Version

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.jsjquery-migrate.min.jswp-embed.min.jswp-emoji-release.min.js文件。这些文件在每个网站上都是相同的,但它们为每个网站分别分发。这意味着即使您已经在浏览器缓存中有了这些文件,您仍然会一次又一次地下载相同的文件。现在想象一下,如果这些文件不是分别分发的,而是为每个网站从同一位置分发。现在,您只需下载一次文件,每次访问另一个网站时,您都会从浏览器缓存中使用它们。这意味着这些网站会更快地加载(您不再下载相同的文件),使用更少的数据(为网站支付的带宽更少,从您的数据限额中使用的数据更少),在浏览器缓存中使用的空间更少(这可以用于缓存其他东西),对他们的服务器造成的负载更少(所有这些使事情更加节能)。这就是commonWP背后的想法。由于WordPress网站使用的文件大多都是开源的(这意味着可以在公共CDN上找到),为什么不从中央位置分发它们并享有上述所有好处呢?(这就是名字的由来:Common WordPress。)
  • 如果我已经使用CDN了怎么办?
    • commonWP将尝试重写存在于jsDelivr上的文件。对于其他文件,您将回退到您使用的CDN。这仅在您使用的CDN插件在commonWP之前运行时才有效。
  • 如果我使用Autoptimize或其他插件进行自动连接或压缩怎么办?
    • 如果该插件在commonWP之前没有运行,您将自动连接或压缩commonWP未重写的文件。
  • 我可以配置哪些选项?
    • UI中没有,尽管如果您需要,可以通过WordPress过滤器配置几个设置。这仅适用于了解自己在做什么的开发者。以下是一些示例,并查看完整的代码参考http://api.milandinic.com/commonwp/
  • 关于隐私和GDPR怎么办?

标记存在于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.