Skip to content

Laravel Elixir

介绍

Laravel Elixir 为定义 Laravel 应用程序的基本 Gulp 任务提供了一个简洁、流畅的 API。Elixir 支持多种常见的 CSS 和 JavaScript 预处理器,甚至包括测试工具。

如果你曾经对如何开始使用 Gulp 和资产编译感到困惑,你一定会喜欢 Laravel Elixir!

安装与设置

安装 Node

在触发 Elixir 之前,你必须先确保你的机器上安装了 Node.js。

php
node -v

默认情况下,Laravel Homestead 包含了你所需的一切;然而,如果你不使用 Vagrant,你可以通过访问 Node.js 下载页面 来轻松安装 Node。别担心,这很快也很简单!

Gulp

接下来,你需要将 Gulp 作为全局 NPM 包引入,如下所示:

php
npm install --global gulp

Laravel Elixir

剩下的唯一步骤就是安装 Elixir!在新的 Laravel 安装中,你会在根目录找到一个 package.json 文件。可以将其视为 composer.json 文件,但它定义的是 Node 依赖项而不是 PHP。你可以通过运行以下命令来安装它引用的依赖项:

php
npm install

使用

现在你已经安装了 Elixir,你将很快开始编译和连接文件!项目根目录中的 gulpfile.js 文件包含了所有的 Elixir 任务。

编译 Less

javascript
elixir(function(mix) {
	mix.less("app.less");
});

在上面的例子中,Elixir 假设你的 Less 文件存储在 resources/assets/less 中。

编译多个 Less 文件

javascript
elixir(function(mix) {
	mix.less([
		'app.less',
		'something-else.less'
	]);
});

编译 Sass

javascript
elixir(function(mix) {
	mix.sass("app.scss");
});

这假设你的 Sass 文件存储在 resources/assets/sass 中。

默认情况下,Elixir 在底层使用 LibSass 库进行编译。在某些情况下,使用 Ruby 版本可能更有利,尽管速度较慢,但功能更丰富。假设你已经安装了 Ruby 和 Sass gem(gem install sass),你可以像这样启用 Ruby 模式:

javascript
elixir(function(mix) {
	mix.rubySass("app.sass");
});

编译时不使用源映射

javascript
elixir.config.sourcemaps = false;

elixir(function(mix) {
	mix.sass("app.scss");
});

源映射默认是启用的。因此,对于每个编译的文件,你会在同一目录中找到一个伴随的 *.css.map 文件。此映射允许你在调试时将编译后的样式表选择器追溯到原始的 Sass 或 Less 部分!如果你需要禁用此功能,上面的代码示例将完成此操作。

编译 CoffeeScript

javascript
elixir(function(mix) {
	mix.coffee();
});

这假设你的 CoffeeScript 文件存储在 resources/assets/coffee 中。

编译所有 Less 和 CoffeeScript

javascript
elixir(function(mix) {
    mix.less()
       .coffee();
});

触发 PHPUnit 测试

javascript
elixir(function(mix) {
	mix.phpUnit();
});

触发 PHPSpec 测试

javascript
elixir(function(mix) {
	mix.phpSpec();
});

合并样式表

javascript
elixir(function(mix) {
	mix.styles([
		"normalize.css",
		"main.css"
	]);
});

传递给此方法的路径相对于 resources/assets/css 目录。

合并样式表并保存到自定义目录

javascript
elixir(function(mix) {
	mix.styles([
		"normalize.css",
		"main.css"
	], 'public/build/css/everything.css');
});

从自定义基础目录合并样式表

javascript
elixir(function(mix) {
	mix.styles([
		"normalize.css",
		"main.css"
	], 'public/build/css/everything.css', 'public/css');
});

stylesscripts 方法的第三个参数确定传递给方法的所有路径的相对目录。

合并目录中的所有样式

javascript
elixir(function(mix) {
	mix.stylesIn("public/css");
});

合并脚本

javascript
elixir(function(mix) {
	mix.scripts([
		"jquery.js",
		"app.js"
	]);
});

同样,这假设所有路径相对于 resources/assets/js 目录。

合并目录中的所有脚本

javascript
elixir(function(mix) {
	mix.scriptsIn("public/js/some/directory");
});

合并多组脚本

javascript
elixir(function(mix) {
    mix.scripts(['jquery.js', 'main.js'], 'public/js/main.js')
       .scripts(['forum.js', 'threads.js'], 'public/js/forum.js');
});

版本化/哈希化文件

javascript
elixir(function(mix) {
	mix.version("css/all.css");
});

这将为文件名附加一个唯一的哈希值,以实现缓存清除。例如,生成的文件名将类似于:all-16d570a7.css

在你的视图中,你可以使用 elixir() 函数加载适当的哈希资产。以下是一个示例:

php
<link rel="stylesheet" href="{{ elixir("css/all.css") }}">

在后台,elixir() 函数将确定应包含的哈希文件的名称。你是否已经感受到肩上的负担减轻了?

你还可以将数组传递给 version 方法以版本化多个文件:

javascript
elixir(function(mix) {
	mix.version(["css/all.css", "js/app.js"]);
});
php
<link rel="stylesheet" href="{{ elixir("css/all.css") }}">
<script src="{{ elixir("js/app.js") }}"></script>

将文件复制到新位置

javascript
elixir(function(mix) {
	mix.copy('vendor/foo/bar.css', 'public/css/bar.css');
});

将整个目录复制到新位置

javascript
elixir(function(mix) {
	mix.copy('vendor/package/views', 'resources/views');
});

触发 Browserify

javascript
elixir(function(mix) {
	mix.browserify('index.js');
});

想在浏览器中使用模块吗?希望尽早使用 EcmaScript 6?需要内置的 JSX 转换器吗?如果是这样,Browserify,以及 browserify Elixir 任务,将很好地完成这项工作。

此任务假设你的脚本存储在 resources/assets/js 中,尽管你可以自由覆盖默认设置。

方法链

当然,你可以将 Elixir 的几乎所有方法链接在一起以构建你的配方:

javascript
elixir(function(mix) {
    mix.less("app.less")
       .coffee()
       .phpUnit()
       .version("css/bootstrap.css");
});

Gulp

现在你已经告诉 Elixir 要执行哪些任务,你只需从命令行触发 Gulp。

执行所有注册的任务一次

php
gulp

监视资产的变化

php
gulp watch

仅编译脚本

php
gulp scripts

仅编译样式

php
gulp styles

监视测试和 PHP 类的变化

php
gulp tdd
lightbulb

所有任务将假定为开发环境,并将排除缩小。对于生产环境,请使用 gulp --production

自定义任务和扩展

有时,你会希望将自己的 Gulp 任务挂接到 Elixir 中。也许你有一个特殊的功能,希望 Elixir 为你混合和监视。没问题!

例如,假设你有一个通用任务,在调用时简单地说出一些文本。

javascript
gulp.task("speak", function() {
	var message = "Tea...Earl Grey...Hot";

	gulp.src("").pipe(shell("say " + message));
});

很简单。从命令行,你当然可以调用 gulp speak 来触发任务。然而,要将其添加到 Elixir 中,请使用 mix.task() 方法:

javascript
elixir(function(mix) {
    mix.task('speak');
});

就是这样!现在,每次你运行 Gulp 时,你的自定义 "speak" 任务将与任何其他 Elixir 任务一起执行。要另外注册一个监视器,以便每次一个或多个文件被修改时重新触发你的自定义任务,你可以将正则表达式作为第二个参数传递。

javascript
elixir(function(mix) {
    mix.task('speak', 'app/**/*.php');
});

通过添加第二个参数,我们指示 Elixir 每次保存 "app/" 目录中的 PHP 文件时重新触发 "speak" 任务。

为了获得更大的灵活性,你可以创建完整的 Elixir 扩展。使用之前的 "speak" 示例,你可以编写一个扩展,如下所示:

javascript
var gulp = require("gulp");
var shell = require("gulp-shell");
var elixir = require("laravel-elixir");

elixir.extend("speak", function(message) {

	gulp.task("speak", function() {
		gulp.src("").pipe(shell("say " + message));
	});

	return this.queueTask("speak");

 });

注意,我们通过传递将在 Gulpfile 中引用的名称以及将创建 Gulp 任务的回调函数来 extend Elixir 的 API。

如前所述,如果你希望监视自定义任务,请注册一个监视器。

javascript
this.registerWatcher("speak", "app/**/*.php");

这行代码指定当任何匹配正则表达式 app/**/*.php 的文件被修改时,我们希望触发 speak 任务。

就是这样!你可以将其放在 Gulpfile 的顶部,或者将其提取到自定义任务文件中。如果你选择后者,只需将其引入 Gulpfile,如下所示:

javascript
require("./custom-tasks")

完成了!现在,你可以将其混合使用。

javascript
elixir(function(mix) {
	mix.speak("Tea, Earl Grey, Hot");
});

有了这个添加,每次你触发 Gulp 时,Picard 将请求一些茶。