使用 Grunt 优化 WordPress 开发

使用 grunt 优化 wordpress 开发

在本教程中,我们将了解如何使用 Grunt,特别是帮助和加快您的 WordPress 开发工作流程。

Grunt 是一个通过 NPM 安装并在您的服务器上运行的 JavaScript 任务运行程序。要使用本教程中的信息,您需要通过命令行访问服务器。为了简洁起见,我建议您参考本教程来设置、运行 Grunt 并准备使用。

Grunt 是一个经过验证的任务运行器,可以在许多不同的平台上以多种不同的方式使用。在这里,我们将着眼于定义 WordPress 开发的坚实基础。

常见任务

Grunt 的社区非常强大,这导致了巨大的插件目录的开发。很容易迷失方向并花费大量时间搜索和审查要使用哪些。

那么 WordPress 主题或插件需要完成或提供哪些常见任务?

使用 WordPress 翻译功能本地化语言字符串资产文件的管理。也就是说,使用 JavaScript 和 CSS 文件的开发和缩小版本。

本地化

Grunt 有一个非常成功的 WordPress 专用本地化包,名为 grunt-wp-i18n。这个 Grunt 包非常宝贵,因为它将扫描您的主题/插件文件夹,查找所有翻译字符串,并在指定位置编译 .pot 文件。然后可以使用此 .pot 文件转换 .po.mo 文件,以便其他用户翻译您的主题/插件。

要配置包,请将以下内容添加到 Gruntfile.js initConfig 选项中:

makepot: {    target: {        options: {            include: [                'path/to/some/file.php'            ],            type: 'wp-plugin' // or `wp-theme`        }    }}

然后像这样调用 Grunt 任务(在 Gruntfile.js 文件夹中):

grunt makepot

正在扫描您的整个文件夹,并且所有字符串都符合 pot 文件。

资产文件

所有主题和插件都定期使用 JavaScript 和 CSS 文件。不幸的是,很多时候对文件的开发和生产版本的需求被忽视。

根据 WordPress 本身的提示,我的目标是确保我已完全评论并缩小了文件:

文件名.js文件名.min.js文件名.css文件名.min.css为什么?我想知道这些文件中发生了什么,但我也想知道我的访问者正在获得这些文件的优化版本。

要在没有某种形式的任务运行程序的情况下执行此操作,意味着在开发过程中切换在 WordPress 中注册的资产 URL 以查看更改后的未缩小版本,在发布更新之前使用某种形式的 JavaScript 和 CSS 压缩器,然后切换返回已注册的 URL。这一点也不好玩。

借助 Grunt,您可以使用 Uglify 包动态缩小和优化 JavaScript 文件,为了进一步使用 CSS,我们还可以使用 Sass 任务将 Sass 文件动态编译为 CSS。就其价值而言,我使用 Sass,因为 WordPress 在底层使用的是 Sass,但 Grunt 也有一个 LESS 编译器。

uglify: {    dist: {        options: {            banner: '/*!   filename.min.js  */n',            report: 'gzip'        },        files: {            'assets/js/filename.min.js' : [                'assets/path/to/file.js',                'assets/path/to/another/file.js',                'assets/dynamic/paths/**/*.js'            ]        }    },    dev: {        options: {            banner: '/*!   filename.js  */n',            beautify: true,            compress: false,            mangle: false        },        files: {            'assets/js/filename.js' : [                'assets/path/to/file.js',                'assets/path/to/another/file.js',                'assets/dynamic/paths/**/*.js'            ]        }    }}
sass: {    dist: {        options: {            banner: '/*!   filename.min.css  */n',            style: 'compressed'        },        files: [{            expand: true,            cwd: 'assets/scss',            src: [                '*.scss'            ],            dest: 'assets/css',            ext: '.min.css'        }]    },    dev: {        options: {            banner: '/*!   filename.css  */n',            style: 'expanded'        },        files: [{            expand: true,            cwd: 'assets/scss',            src: [                '*.scss'            ],            dest: 'assets/css',            ext: '.css'        }]    }}

提示:如果使用 sass 任务,请将 .sass-cache 添加到 .gitignore 以防止将编译器缓存添加到您的存储库中。

高级任务

我们已经介绍了 Grunt 可以帮助 WordPress 开发的两个关键领域,但让我们更进一步,看看使用任务运行程序的额外功能。

查看文件

我们已经提供了处理文件的任务,为什么不对其进行优化呢?通过上面的任务,我们每次进行更改时都需要运行 grunt *** ,为什么不安装 grunt-contrib-watch 包呢?配置完成后,这将指示 Grunt 在每次检测到文件更改时运行这些任务。

grunt watch

急!不再需要在每次文件更改时运行 Grunt,只需启动观察器并编辑文件即可。

JavaScript 质量

在我们的 JavaScript 文件上运行 JSHint 来追踪这些错误或丢失的分号不是很好吗?只需在编译文件之前安装 grunt-contrib-jshint 任务并将其安装到观察器任务即可。现在,Grunt 将警告您任何错误并停止运行进一步的任务。

jshint: {    files: [        'assets/js/filename.js',        'assets/dynamic/paths/**/*.js'    ],    options: {        expr: true,        globals: {            jQuery: true,            console: true,            module: true,            document: true        }    }}

合并资产

这对我开发 Fluent 框架特别有用。 Fluent Framework 是一组类,其中包括创建选项页面和元框。

为了使开发单个字段更容易,我有一个如下的文件结构:

萤石开放平台 萤石开放平台

萤石开放平台:为企业客户提供全球化、一站式硬件智能方案。

萤石开放平台 106 查看详情 萤石开放平台

assets/├── js/|   ├── filename.js├── fields/    ├── text/    |   ├── js/    |       ├── text.js    ├── select/        ├── js/            ├── select.js

这使得找到我正在研究的领域并仅更改该领域所需的 JavaScript 变得非常容易。

从用户的角度来看,我只想提供一个 JavaScript 文件,其中包含所有常见的和基于字段的 JavaScript。让我们使用 grunt-contrib-uglify 任务来完成此任务。

uglify: {    dist: {        options: {            banner: '/*!   filename.min.js  */n',            report: 'gzip'        },        files: {            'assets/js/filename.min.js' : [                'assets/path/to/file.js',                'assets/path/to/another/file.js',                'assets/dynamic/paths/**/*.js'            ]        }    },    dev: {        options: {            banner: '/*!   filename.js  */n',            beautify: true,            compress: false,            mangle: false        },        files: {            'assets/js/filename.js' : [                'assets/path/to/file.js',                'assets/path/to/another/file.js',                'assets/dynamic/paths/**/*.js'            ]        }    }}

通过此配置,通过 JSHint 后,会将所有 JavaScript 文件合并为开发文件和生产文件。

复制文件

WordPress.org 需要 Readme.txt 文件来详细说明主题/插件信息,但 GitHub 和 BitBucket 等版本控制系统更喜欢 Readme.md 文件。我们不需要手动复制或保持这些文件同步。让 Grunt 帮我们做这件事吧!

安装 grunt-contrib-copy 任务并按如下方式配置:

copy: {    dist: {        src: 'readme.txt',        dest: 'README.md'    }}

下载数据

另一个有用的 Grunt 任务是 Grunt cURL 包。 Fluent 框架字段之一需要访问 Google Fonts API 数据。按照 Google 的建议加载此内容将是每次加载页面时的 HTTP 请求。或者,如果您手动复制文件内容,则可能会面临过时的风险。两全其美的方法是使用 Grunt Curl 来保存请求并获取更新。

为了保持最新状态,我们只需加载 cURL 任务,为其提供从中获取字体数据的 URL 以及保存响应的位置。

curl: {    'google-fonts-source': {        src: 'https://www.googleapis.com/webfonts/v1/webfonts?key=*******',        dest: 'assets/vendor/google-fonts-source.json'    }}

现在,每次我们运行任务时,都会下载最新的字体列表,并将其保存到框架文件中。

文档

此任务最适合用于许多开发人员都会窥探的主题、插件和框架。对于那些探索代码库的人来说,上下文从来都不是坏事。

PHP Documentor 是一个用于自动生成该数据的出色工具。它还可以帮助您专注于在代码中提供有意义的 DocBlock。

phpdocumentor: {    dist: {        options: {            ignore: 'node_modules'        }    }}

提示:将 docs 添加到您的 .gitignore 如果您不想提交文档及其所有缓存文件。

把它们放在一起

这是用于执行上述任务的 package.jsonGruntfile.js

package.json

{    "name": "package-name",    "version": "1.0.0",    "description": "...",    "main": "filename.php",    "scripts": {        "test": "echo "Error: no test specified" && exit 1"    },    "repository": {        "type": "git",        "url": "http://repo-url.com"    },    "keywords": [        "wordpress"    ],    "author": "Your Name",    "license": "GPL",    "devDependencies": {        "grunt": "~0.4.2",        "grunt-contrib-copy": "~0.5.0",        "grunt-contrib-jshint": "~0.8.0",        "grunt-contrib-sass": "^0.7.3",        "grunt-contrib-uglify": "~0.3.3",        "grunt-curl": "*",        "grunt-phpdocumentor": "~0.4.1",        "grunt-wp-i18n": "~0.4.0"    }}

Gruntfile.js

module.exports = function(grunt) {    grunt.initConfig({        pkg: grunt.file.readJSON('package.json'),        copy: {            dist: {                src: 'readme.txt',                dest: 'README.md'            }        },        curl: {            'google-fonts-source': {                src: 'https://www.googleapis.com/webfonts/v1/webfonts?key=*******',                dest: 'assets/vendor/google-fonts-source.json'            }        },        makepot: {            target: {                options: {                    include: [                        'path/to/some/file.php'                    ],                    type: 'wp-plugin' // or `wp-theme`                }            }        },        jshint: {            files: [                'assets/js/filename.js',                'assets/dynamic/paths/**/*.js'            ],            options: {                expr: true,                globals: {                    jQuery: true,                    console: true,                    module: true,                    document: true                }            }        },        phpdocumentor: {            dist: {                options: {                    ignore: 'node_modules'                }            }        },        sass: {            dist: {                options: {                    banner: '/*!   filename.min.css  */n',                    style: 'compressed'                },                files: [{                    expand: true,                    cwd: 'assets/scss',                    src: [                        '*.scss'                    ],                    dest: 'assets/css',                    ext: '.min.css'                }]            },            dev: {                options: {                    banner: '/*!   filename.css  */n',                    style: 'expanded'                },                files: [{                    expand: true,                    cwd: 'assets/scss',                    src: [                        '*.scss'                    ],                    dest: 'assets/css',                    ext: '.css'                }]            }        },        uglify: {            dist: {                options: {                    banner: '/*!   filename.min.js  */n',                    report: 'gzip'                },                files: {                    'assets/js/filename.min.js' : [                        'assets/path/to/file.js',                        'assets/path/to/another/file.js',                        'assets/dynamic/paths/**/*.js'                    ]                }            },            dev: {                options: {                    banner: '/*!   filename.js  */n',                    beautify: true,                    compress: false,                    mangle: false                },                files: {                    'assets/js/filename.js' : [                        'assets/path/to/file.js',                        'assets/path/to/another/file.js',                        'assets/dynamic/paths/**/*.js'                    ]                }            }        }    });    grunt.loadNpmTasks('grunt-contrib-copy');    grunt.loadNpmTasks('grunt-contrib-jshint');    grunt.loadNpmTasks('grunt-contrib-sass');    grunt.loadNpmTasks('grunt-contrib-uglify');    grunt.loadNpmTasks('grunt-curl');    grunt.loadNpmTasks('grunt-phpdocumentor');    grunt.loadNpmTasks('grunt-wp-i18n');    grunt.registerTask('default', [        'jshint',        'uglify:dev',        'uglify:dist',        'sass:dev',        'sass:dist',        'makepot',        'copy'    ]);    grunt.registerTask('docs', [        'phpdocumentor:dist'    ]);    grunt.registerTask('googlefonts', [        'curl:google-fonts-source'    ]);};

提示:添加 node_modulesnpm-debug .log 到您的 class=”inline”>.gitignore 以防止任务作为关联文件添加到您的存储库中。

结论

正如您从上面的任务中看到的,Grunt 可用于帮助自动化 WordPress 开发,让您有更多时间专注于编写代码,而不是管理代码。

我们只详细介绍了 WordPress 的一些任务,但还有许多其他软件包可以满足项目特定需求,例如图像优化任务等等,所以去探索吧!

Grunt 现在是一个完善的任务运行器,并且文档与 WordPress 本身相当,为什么不考虑制作一个尚未想到的任务并与社区分享呢?

资源

咕噜声Node.jsGrunt 入门

使用的 Grunt 任务

JSHint 咕噜咕噜丑化咕噜萨斯咕噜WPi18n咕噜手表咕噜复制Grunt PHP 文档编写器咕噜卷曲

以上就是使用 Grunt 优化 WordPress 开发的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/532548.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Linux strings命令能否识别特定编码文本
上一篇 2025年11月9日 11:19:52
PHP框架适合哪些行业?
下一篇 2025年11月9日 11:20:04

相关推荐

  • 优麒麟 25.10 版本正式发布

    优麒麟 25.10 正式版现已上线,此版本将提供长达9个月的支持周期,基于最新的 linux 6.17 内核打造,在基础库、子系统及核心组件等方面实现了全面升级,显著提升了系统的稳定性与兼容性,同时推出了焕然一新的软件商店。 新增特性 1. 搭载 Linux 6.17 内核 优麒麟 25.10 集成…

    2026年9月23日
    000
  • win10右键菜单项目太多怎么办_win10右键菜单过多优化方法

    可通过注册表编辑器、第三方工具或安全软件清理Windows 10右键菜单冗余项。首先备份注册表,进入HKEY_CLASSES_ROOTDirectoryBackgroundshellexContextMenuHandlers路径删除无用项,同样检查HKEY_CLASSES_ROOT*shellexC…

    2026年9月23日
    100
  • 苹果MacBook Pro 16 M3 Max对决戴尔XPS 17:移动工作站的屏幕素质与综合性能,谁是视频剪辑师的终极生产力工具?

    MacBook Pro 16 M3 Max在屏幕素质、能效和生态整合上领先,适合Final Cut Pro用户;戴尔XPS 17凭借强大显卡和Windows兼容性,更适合依赖Adobe软件和CUDA加速的视频剪辑师。 对于视频剪辑师来说,选择一台能扛起整个工作流的移动工作站至关重要。苹果MacBoo…

    2026年9月23日
    100
  • 蹭《丝之歌》热度吸引玩家?独立游戏开发者回应

    在如今高度饱和的独立游戏领域,如何让作品被更多玩家看见,成为每位开发者面临的难题。不少创作者开始借助热门话题来提升曝光,《Constance》的开发者btf便是其中之一。这款2D动作平台游戏近期频繁与备受期待的《空洞骑士:丝之歌》相提并论,引发了不少讨论。 部分玩家在社交平台上指出,《Constan…

    2026年9月23日
    300
  • linux如何优雅的关机

    优雅关机的三大法宝:拔电源、shutdown、poweroff 及其对硬件和数据的影响 在讨论关机方法之前,先了解一下机械硬盘的内部结构。 那固态硬盘SSD呢? FTL工作示意图。FTL表对SSD至关重要,如果在FTL写回Flash之前突然断电,内存数据丢失,FTL表也将丢失。因此,高端SSD和服务…

    2026年9月23日
    000
  • PHP自定义函数:创建与使用 prev_id() 函数的实践指南

    本文旨在指导读者如何定义和实现自定义PHP函数,以解决“Call to undefined function”错误。通过 prev_id() 函数的创建示例,详细阐述了函数的基本语法、参数传递、返回值以及在实际应用(如数据库查询)中的集成方法,并提供了关键注意事项,帮助开发者编写模块化、可维护的代码…

    2026年9月23日
    000
  • mysql数据库中触发器和存储过程如何协同

    触发器可调用存储过程实现复杂逻辑与数据一致性。例如,订单插入后通过触发器调用存储过程更新库存并记录日志;共用业务规则如积分调整封装在存储过程中,被多个触发器复用,提升可维护性;触发器还可调用存储过程插入异步任务到消息表,解耦耗时操作,由后台脚本处理通知或数据同步,保障主事务效率。 在MySQL数据库…

    2026年9月23日
    100
  • 抖音专营店怎么开?抖音怎么开通店铺

    抖音专营店怎么开?抖音怎么开通店铺抖音专营店怎么开?抖音怎么开通店铺抖音专营店怎么开?抖音怎么开通店铺抖音专营店怎么开?抖音怎么开通店铺

    如今,抖音作为一款风靡全国的短视频平台,已经深深融入了人们的日常生活。其庞大的用户基数和强大的消费能力,让众多商家看到了无限商机,纷纷希望能在平台上开设专营店。那么,究竟如何在抖音上成功开通一家专营店呢?接下来的内容将为您全面解析。 一、了解抖音专营店的核心优势 流量资源丰富:抖音拥有海量活跃用户,…

    2026年9月23日 用户投稿
    000
  • 四种获取fasta序列长度的方法

    在处理fasta序列时,我们常常需要知道每条序列的长度。今天小编将与大家分享四种获取fasta序列长度的方法。 一、使用awk 以下是使用awk获取fasta序列长度的代码: awk ‘/^>/{if (l!=””) print l; print; l=0; next}{l+=length($…

    2026年9月23日
    200
  • 苹果iOS 17更新是否会自动删除带有验证码的信息

    在当今高度数字化的生活中,验证码广泛应用于登录账户、密码重置、支付验证等关键操作。然而,这类敏感信息若长期保留在手机中,可能成为潜在的安全隐患。苹果在iOS 17中引入的自动清理机制,正是为了解决这一痛点而设计。 当用户接收到含有验证码的短信时,系统会智能识别其中的关键信息,并在后台进行标记。根据用…

    2026年9月23日
    000
  • 如何通过Webman框架实现定时任务和计划任务?

    如何通过webman框架实现定时任务和计划任务? Webman是一个基于Go语言开发的轻量级Web框架,它提供了一种简单的方式来实现定时任务和计划任务。本文将介绍如何使用Webman框架来实现定时任务和计划任务,并提供相应的代码示例。 在使用Webman框架之前,需要先安装Webman。可以通过以下…

    用户投稿 2026年9月23日
    200
  • 一部可以战斗的视觉小说,独立游戏《弃种:叮叮与圣剑》今日正式发售!

    一部可以战斗的视觉小说,独立游戏《弃种:叮叮与圣剑》今日正式发售!一部可以战斗的视觉小说,独立游戏《弃种:叮叮与圣剑》今日正式发售!一部可以战斗的视觉小说,独立游戏《弃种:叮叮与圣剑》今日正式发售!一部可以战斗的视觉小说,独立游戏《弃种:叮叮与圣剑》今日正式发售!

    由圣剑提灯开发、infini fun发行的视觉小说新作《弃种:叮叮与圣剑》现已正式上线steam平台,国区售价为43元,在首发阶段可享受为期十四天的九折优惠。 圣剑提灯是由《宝石研物语2:血缘之证》制作人与《宝石研物语》系列主美联手打造的全新团队。在坚持初心、用心创作一年半后,他们携“讲故事”为核心…

    2026年9月23日 用户投稿
    000
  • VSCode如何实现代码版本对比 VSCode Git差异对比的高效使用方法

    vscode通过scm视图直接对比工作区与head的差异;2. 点击已暂存文件可查看暂存区与head的差异;3. 通过命令面板、scm历史记录或右键菜单可对比任意版本或文件;4. 差异视图支持并排和内联模式,并提供跳转导航;5. 时间线视图可追溯文件级提交历史并对比各版本;6. gitlens扩展增…

    2026年9月23日
    500
  • mysql索引怎么用 mysql创建索引提高查询性能方法

    mysql索引怎么用 mysql创建索引提高查询性能方法mysql索引怎么用 mysql创建索引提高查询性能方法mysql索引怎么用 mysql创建索引提高查询性能方法mysql索引怎么用 mysql创建索引提高查询性能方法

    索引是mysql中提高查询性能的关键工具,它类似于书籍目录,可快速定位数据。创建索引主要使用create index或alter table语句,例如:create index idx_email on users (email); 或 alter table users add index idx…

    2026年9月23日 用户投稿
    000
  • Java中基于栈验证JSON字符串结构有效性的方法

    本文探讨了在Java中利用栈(Stack)数据结构验证JSON字符串结构有效性的方法。我们将分析一个常见的基于栈的实现示例,指出其在处理字符串内部字符、引号平衡以及转义字符方面的潜在缺陷。文章将提供一个改进的解决方案,并强调此方法主要用于结构匹配,而非完整的JSON语法验证,同时建议生产环境中使用专…

    2026年9月23日
    100
  • 申请企业抖音号需要多少费用?如何申请微信企业号

    随着短视频平台的迅速发展,抖音已成为众多企业进行品牌推广的重要阵地。越来越多的企业希望通过注册抖音企业账号来提升自身的影响力和知名度。然而,在注册过程中,许多企业对相关费用问题存在疑问。本文将为您详细解析企业抖音号的申请与运营费用。 一、企业抖音号申请费用概况 1. 注册费用 目前,企业在抖音平台上…

    2026年9月23日
    000
  • 快手极速版官方网页版地址_快手极速版App下载官网首页

    快手极速版官方网页版地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来快手极速版官方网页版地址及App下载相关信息,感兴趣的网友一起随小编来瞧瞧吧! https://www.kuaishou.com/ 1、小步骤内容。进入官网后可直接浏览平台首页推荐内容,涵盖生活记录、才艺展示等多个领域…

    2026年9月23日
    200
  • 如何使用Webman框架实现RESTful API开发?

    如何使用webman框架实现restful api开发? Webman是一个轻量级的PHP框架,专门用于开发RESTful API。它提供了简洁易用的路由、请求-响应处理、中间件等功能,使得API的开发变得高效且易于维护。本文将向您介绍如何使用Webman框架来开发RESTful API,并提供代码…

    用户投稿 2026年9月23日
    000
  • 蚂蚁开源业内首个高性能扩散语言模型推理框架 dInfer

    蚂蚁集团近日正式开源了业界首个高性能扩散语言模型推理框架dinfer。 在多项基准测试中,dInfer展现出卓越的性能表现:其推理速度相较英伟达推出的扩散模型推理框架Fast-dLLM提升了10.7倍;在代码生成任务HumanEval中,单批次推理速度达到惊人的1011 Tokens/秒,首次在开源…

    2026年9月23日
    100
  • Flink项目实践 | Flink 单机安装部署

    Flink项目实践 | Flink 单机安装部署Flink项目实践 | Flink 单机安装部署Flink项目实践 | Flink 单机安装部署Flink项目实践 | Flink 单机安装部署

    apache flink 是一个用于对无界和有界数据流进行状态计算的框架和分布式处理引擎。flink 设计旨在所有常见集群环境中运行,并以内存速度和任意规模进行计算。 为了深入了解 Flink,首先需要搭建其运行环境。 Flink 可以在所有类似 UNIX 的环境中运行,包括 Linux,Mac O…

    2026年9月23日 用户投稿
    200

发表回复

登录后才能评论
关注微信