【问题标题】:Laravel Mix - Is Chaining Required to Ensure Execution Order?Laravel Mix - 是否需要链接来确保执行顺序?
【发布时间】:2020-07-13 09:38:39
【问题描述】:

TLDR;

你必须链接 Laravel Mix 方法来维护执行顺序吗?是否有任何异步方法会阻止使用以下非链接模式mix.scripts(); mix.js(); mix.sass();

我运行的几个测试表明我不需要链接。

一个例子

由于我们的 Laravel 应用程序的设置方式,我们需要有多个 Laravel Mix 设置。我们不是复制粘贴webpack.mix.js 文件并在每个文件中到处修改几行,而是创建一个传递给单个webpack.mix.js 文件的配置对象。在这个文件中,我们将检查是否已经配置了各种东西,如果是,则运行适当的 Mix 方法。下面是一个伪代码示例。

if ( config.js ) {
  mix.js( config.js.src, config.js.dist );
}

if ( config.sass ) {
  mix.sass( config.sass.src, config.sass.dist );
}

if ( config.concat ) {

  if ( config.concat.styles ) {

    // Could be more than one set of files that need to be combined, so array.
    config.concat.styles.map( ( files ) => {
      mix.styles( files.src, files.dist );
    }
  }

  if ( config.concat.scripts ) {

    // Could be more than one set of files that need to be combined, so array.
    config.concat.scripts.map( ( files ) => {
      mix.scripts( files.src, files.dist );
    }
  }

}

目前,我们的代码更像您在网络上看到的大多数示例。

mix
  .options()
  .webpackConfig()
  .styles()
  .styles()
  .scripts()
  .js()
  .sass();

【问题讨论】:

    标签: laravel webpack laravel-mix


    【解决方案1】:

    laravel-mix抽象webpack的配置,动态生成webpack config

    API implementation 的组织是使用带有fluent or chainable interface 的Builder 模式完成的。 这使得生成特定配置时只需调用必须执行的步骤。

    您需要确保webpack.mix.js 模块中的代码can be properly imported

    您需要注意自定义任务的顺序,例如copy, copyDirectorycombineversion。在v5.0.0custom tasks are run 中,与它们的异步性质没有任何关系。然而,they are run sequentially 即将发生变化。

    可以按任意顺序调用其他 API 方法。

    【讨论】:

    • 感谢您的反馈!据我了解,concatstylesscripts 方法或多或少是彼此的别名。我不认为mix.sass() 调用可能依赖于mix.styles() (或类似的)完成的情况,但如果确实如此,我需要注意这一点并寻找可能被触发的事件我可以回应并继续,对吗?我确实有一些复制任务,但如果它们是异步的,那就没问题了。
    • 正确,concat, styles, combine, styles, babel and minify 是彼此的别名。它是在webpack 编译后执行的,因此您无需担心依赖sass 调用的styles,反之亦然。自定义任务在 webpack 编译后运行。您可以mix.dump config 进行调试。
    【解决方案2】:

    我运行的几个测试表明我不需要链接。

    你说的很对!

    Laravel Mix 是用 JavaScript 编写的,并使用了Method Chaining

    您可以使用OnlinePythonTutor 可视化代码执行。

    如果你看下面的代码,你会发现你不一定需要链接方法来维护执行顺序。

    class Person {
      setName(name) {
        this.name = name
        return this
      }
      setAge(age) {
        this.age = age
        return this
      }
    }
    
    var p = new Person()
    p.setName("Alice").setAge(42) // Set name before age
    p.setName("Bob") // Set name
    p.setAge(42) // Set age
    

    你可以可视化这段代码here

    【讨论】:

    • 感谢您的回复。在上面的示例中,一切都是程序性的。在可能是异步的方法中没有发生任何事情。某些 Laravel Mix 方法可能就是这种情况,这是我主要关心的问题。不过,如果他们让 Mix 慈善,他们不会让任何方法异步,这是有道理的。
    猜你喜欢
    • 1970-01-01
    • 2014-07-22
    • 2016-08-06
    • 2023-02-03
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 2021-05-18
    • 2022-08-04
    相关资源
    最近更新 更多