了解 Laravel 混合

Posted

技术标签:

【中文标题】了解 Laravel 混合【英文标题】:Understanding Laravel Mix 【发布时间】:2017-07-25 17:21:14 【问题描述】:

了解 Laravel Mix

我目前正在将我的一个网站迁移到 Laravel,以使其在未来更易于维护……我有丰富的使用 Laravel 构建 API 的经验,但我使用 Laravel 构建网站的经验非常有限因此,我需要其他专业人士的一点指导。

简而言之,如果有人能抽出几分钟时间,我将非常感谢以下非常简单问题的答案...

基于文件的 JS & CSS 而不是基于应用程序

我喜欢以特定方式编写我的 JS 和 CSS 文件,其中每个页面都有自己的与页面相关的特定文件。例如,about.php 可能具有以下依赖项:

JS:

jquery.js any_other_third_party_library.js app.js(全局函数) about.js(页面特定功能)

CSS:

some_third_party_library.css app.css(全局样式) about.css(页面特定样式)

在我自己的框架上,上述内容将被合并并缩小为一个用于 JS 的文件和一个用于 CSS 的文件。据我了解,Laravel Mix 正是这样做的......

但是,据我所知,这样做的方法如下:

webpack.mix.js:

// About
mix.scripts([
    'resources/assets/js/app.js',
    'resources/assets/js/about/about.js'
], 'public/js/about/about.js');

很简单,我想知道什么;以上是解决这个问题的正确方法吗?有没有更好、更高效的方法来为每个页面自动执行此操作?

什么是 bootstrap.js 和 app.js 文件?

据我所知,这些文件只是加载依赖项,但这有点令人困惑,因为某些依赖项可能是特定于页面的......请有人能更详细地解释一下这些文件的用途吗?或者至少,它们之间有什么区别......

摆脱 Vue

我没有兴趣在我的项目中使用Vue,所以我删除了以下文件:

/components/Example.vue

以及 app.js 中的 Vue 代码

这有什么关系吗?

【问题讨论】:

我认为首先你必须看看结果应该是什么样子。据我了解,您有一个非常简单的 js/css 结构,没有任何预处理器。因此,首先要缩小您的全局资产,然后按页面对其他资产进行分组。 @CerlinBoss 是的,你是对的,我的 JS/CSS 结构非常简单,事实上,我希望大多数网站都使用类似的东西。不过,我希望有一个文件,例如about-some_hash.js 包含 about.php 所需的所有代码。 CSS 也是如此...基本上每个页面都有一个 unique 组合和缩小文件。这有意义吗? 当然。正如我之前所说,您可以拥有一个全局 js (min) 文件和 css (min) 文件,然后分别拥有特定于页面的缩小 js 和 css 文件。 Laravel mix 除了 gulp 会做的事情之外什么也没做。 @CerlinBoss 是的,但是应该将这些结合起来以减少请求的数量...本质上,我想知道的很简单,这样做是不是不好的做法:mix.js(['resources/assets/js/app.js', 'resources/assets/js/about/about.js'], 'public/js/about/about.js')每个页面...或者有更好的方法吗? @CerlinBoss 我将在此处发布我的新问题的链接,如果您愿意,请随时在此处回答:-D 【参考方案1】:

您将把所有样式和脚本打包成一个文件,然后将它们压缩后提供给客户端。

对于前端资产,请致电mix.sass('resources/assets/sass/app.scss')。在该样式的入口点中,您将能够根据需要使用 Sass 的 @import 'about'; 语法导入其他样式表。 (也将您的其他 CSS 文件重命名为以 .scss 结尾)。

对于您的后端资产,请致电mix.js('resources/assets/js/app.js')。然后,类似地,您可以使用 import './about.js'; 导入其他 javascript 模块。您可能想查找 ES2015 模块,以便学习如何编写模块化 JavaScript。

通读bootstrap.js 文件,了解 Laravel 如何默认连接 jQuery 和 Vue。您不需要其中的任何内容,因此请删除您不想要的任何内容,或者如果您不需要任何内容​​,请删除整个文件。

Vue 与 Laravel 一起开箱即用,但这只是一个建议,您可以将其替换为您自己选择的前端框架,或者将其删除并什么都不替换。由你决定。

编辑:长话短说;使用 mix.sassmix.js,阅读使用 Sass 和 ES2015 模块编写很棒的代码。

【讨论】:

首先非常感谢您的回答!但是,我认为您并没有真正理解我的问题。我不是在问 Laravel Mix 是做什么的,我知道它是做什么的......我想了解的是使用 Laravel Mix 压缩 特定文件 的最有效方法是什么>特定页面? 我建议您不要这样做,而是为您的整个应用程序使用一种组合的 JavaScript 和一种组合的样式表。如果您询问如何在某些页面上激活脚本的相关样式或部分,您可能会考虑将控制器名称和操作作为类添加到 body 标记,并使用它来定位功能。如果你想使用 Laravel Mix 为每个页面创建一个单独的资源,它不是为此而设计的,也没有真正有效的方法来实现它。 感谢您回到我身边;我听到了你的声音,鉴于 Laravel 显然鼓励使用它,我会试一试,尽管我仍然保留在某些页面上包含未使用的代码......不过,你介意编辑你的答案以包含一个例子app.jssome_page.js,以及一个混合示例,这样我就可以看到我应该如何去做,然后我可以将答案标记为已接受:-D 您使用的大多数网站都会这样做,为您提供单一资产,即使任何给定页面只会使用一个子集。如果你想要一个真实世界的例子,这里是我博客中的webpack.mix.js 文件:github.com/dwightwatson/neontsunami/blob/master/webpack.mix.js 它展示了如果你愿意,你可以如何拥有单独的资产,我分解了我的管理资产,因为它们与主要资产完全不同网站。 非常感谢德怀特,这正是我需要看到的!我确实有最后一个问题,如果这样可以吗?我所有的 javascript 都只是我自己的框架和 jQuery 等中的纯老式 javascript。但是,每个页面都有自己的一个名为 SetPageElements() 的函数的实现,它初始化该特定页面所需的任何内容。您将如何为每个页面创建一个独特的功能?显然我可以重命名每个页面的函数,但如果可以避免的话,我宁愿不这样做......

以上是关于了解 Laravel 混合的主要内容,如果未能解决你的问题,请参考以下文章

混合清单不存在 - 在 Hostgator 共享主机中部署 laravel 时 Laravel Fortify Jetstream 登录/注册问题

Laravel 5.4 混合 npm 运行开发错误

使用 Blade/Mustache 模板混合 Laravel 和 Vue.Js

Laravel 日志系统是怎么处理的?

Laravel 混合问题:日期选择器不起作用

Laravel 叶片和顺风没有正确混合,我不明白为啥