baldwin/magento2-module-less-js-compiler

允许 Magento 2 使用 less nodejs 编译器编译 less 文件

v1.7.0 2024-07-17 12:22 UTC

README

描述

此模块是在对使用 bin/magento setup:static-content:deploy 部署静态资产到生产环境速度缓慢感到沮丧的情况下构建的。特别是,此模块试图解决使用默认的 less.php 库编译 less 文件时的缓慢问题。
此模块通过使用 原始 less.js 编译器提供解决方案,该编译器是用 JavaScript 编写的,并通过 node.js 执行。
我们已经对 less.php 和 less.js 编译器的性能进行了基准测试,less.js 编译器的速度是 less.php 编译器的 1.5 到 3 倍左右,尽管这取决于您的 PHP 版本。如果您运行 PHP 5.x,性能提升将更高,PHP 7.x 本身其实相当快,但 nodejs 版本仍然胜出。

更新:自 Magento 2.3.0 以来,less.php 和 less.js 之间的性能差异似乎已经不大了。我有这样的怀疑,这可能与新版的 less.php 库有关。该库大约在 Magento 2.2.3 & 2.1.12 发布期间发布。因此,升级 less.php 库到最新版本(写作时为 v1.7.0.14)后,对于 Magento 2.2.x 和 2.1.x 的性能差异可能也不那么显著了。
这只是一些猜测,因为不幸的是,我没有跟踪在基准测试中使用的 less.php 库的版本,所以我不确定这个陈述。

自 Magento 2.4.0(或更新的 PHP 版本)以来,性能差异似乎有所改变,有利于 less.php。但是,您可能仍然想使用此模块,以确保本地开发环境和生产环境输出的 CSS 一致。

要求

您至少需要 Magento 2.0.7。我们没有对旧版本进行测试。
如果您想使用此模块,您需要在您构建静态资产的服务器上安装 node.jsnpm
您还需要确保 node 二进制文件可在构建静态资产的用户的 $PATH 环境变量中可用。
您还需要 composer 将此模块添加到您的 Magento 2 商店中。

安装

首先,我们建议您安装 less 编译器本身,并将其保存到您的 package.json 文件中作为生产依赖项

npm install --save less@3.13.1

请注意:从Magento 2.1版本开始,package.json文件被重命名为package.json.sample,以便您可以有自己的nodejs依赖项,而不会因为每次更新Magento而将其覆盖。所以如果您使用的是Magento >= 2.1,确保在运行上述命令之前,将package.json.sample文件复制到package.json,如果您想使用Magento的grunt设置。

然后运行shrinkwrap,以固定less(及其依赖项)的版本,这将生成一个包含所有nodejs生产依赖项及其依赖项的确切版本的npm-shrinkwrap.json文件,这样您就可以确保在另一台机器上安装时使用这些确切版本。

npm shrinkwrap

并确保将这两个文件添加到您的版本控制系统。

与composer的类比,您可以将package.json文件与composer.json文件进行比较,将npm-shrinkwrap.jsoncomposer.lock文件进行比较。

现在安装此模块

composer require baldwin/magento2-module-less-js-compiler

并在Magento中启用它

bin/magento module:enable Baldwin_LessJsCompiler
bin/magento setup:upgrade

最后一步,在您的部署脚本中,确保调用npm install --production。您应该在composer installbin/magento setup:static-content:deploy之间执行此操作。

配置

您有机会配置我们发送给lesscnode命令的参数。默认值是

  • lessc --no-color
  • node --no-deprecation

如果您想覆盖默认参数,可以通过修改您的app/etc/config.phpapp/etc/env.php文件来实现,添加如下内容

    'system' => [
        'default' => [
            'dev' => [
                'less_js_compiler' => [
                    'less_arguments' => '--no-color --ie-compat',
                    'node_arguments' => '--no-deprecation --no-warnings',
                ]
            ]
        ]
    ]

您还可以通过配置在您的app/etc/config.phpapp/etc/env.php文件中启用在less编译过程中遇到警告/错误时抛出异常,默认情况下这是禁用的,您应该在var/log/system.log文件中找到日志记录的问题。但如果您想在编译过程中启用抛出异常,可以在您的app/etc/config.phpapp/etc/env.php文件中进行配置

    'system' => [
        'default' => [
            'dev' => [
                'less_js_compiler' => [
                    'throw_on_error' => true,
                ]
            ]
        ]
    ]

调查less编译错误

当您的.less文件有语法错误或包含无法正确编译的内容时,请查看var/log/system.log文件,它将包含有关导致问题的输出。

备注

  1. 安装此模块将有效地替换默认的less编译器。如果您想回到默认的less编译器,您需要禁用此模块或卸载它。
  2. 此模块期望less编译器位于{MAGENTO_ROOT_DIR}/node_modules/.bin/lessc,这是一个硬编码的路径,被模块使用。如果遵循上述安装步骤,编译器将位于那里,但如果出于某种原因您希望将nodejs模块安装在别处,则此模块将无法工作。如果有人遇到这个问题并且希望我们使其可配置,请告诉我!
  3. 默认的less处理器在Magento 2中将一个选项传递给less编译器,表示应该压缩生成的css文件。在此模块中,我们选择不这样做,因为我们认为这不是在编译less文件时要执行的任务。这应该在后续阶段完成,例如在压缩阶段。如果有人不同意这一点,请告诉我,我对此持开放态度。
  4. 此模块针对Magento版本2.0.7、2.1.x、2.2.x、2.3.x、2.4.x进行了测试

基准测试

简介

这绝对不是非常专业地进行的,但这里有一些我们在我们正在工作的某些Magento 2商店上进行的测试。
我们禁用了并行性,以便更容易理解不同版本之间的比较。
我们只测量了bin/magento setup:static-content:deploy命令的持续时间,由于它会导致严重的性能下降,所以已经禁用了xdebug,并且在每次运行之前,我们都会通过运行以下命令来确保所有缓存都是干净的:

rm -R pub/static/* var/cache/* var/view_preprocessed/* var/generation/* var/di/* var/page_cache/* generated/*

机器

  • 较旧的服务器是一台经常使用的服务器,上面安装了较旧的软件。
  • 较新的服务器是一台新服务器,目前没有流量,并且安装了所有最新的软件版本(撰写本文时)。
  • 较旧的本地机器是一台2011年的Macbook Pro(硬盘已升级为SSD,没有使用vagrant或docker,只使用Macports本机软件)
  • 较新的本地机器是一台2017年的Macbook Pro(使用Homebrew或Macports的本机软件)

结果

* 快速策略部署在这里有描述,目前在Magento 2.2.x和2.3.x和2.4.x版本中存在bug,并且与标准策略表现相同