Skip to content
On this page

@import 和 @require

Stylus 支持字面的 @import 用于 CSS,以及动态导入或引入其他 Stylus 文件。

字面 CSS

任何扩展名为 .css 的文件名都将成为字面值。例如:

stylus
@import "reset.css"
@import "reset.css"

渲染下面显示的字面 CSS @import

stylus
@import "reset.css"
@import "reset.css"

Stylus 导入

声明:在所有使用 @import 导入 Stylus 文件的地方,都可以使用 @require

当使用不带 .css 扩展名的 @import 时,假定它是一个 Stylus 文件(例如,@import "mixins/border-radius")。

@import 的工作原理是遍历一个目录数组,并检查该文件是否存在于其中任何一个目录中(类似于 node 的 require.paths)。该数组默认为单个路径,该路径派生自 filename 选项的 dirname。因此,如果你的文件名是 /tmp/testing/stylus/main.styl,那么导入将在 /tmp/testing/stylus/ 中查找。

@import 也支持索引风格。这意味着当你 @import blueprint 时,它将解析要么 blueprint.styl 或者 blueprint/index.styl。这对于想要暴露所有功能,同时仍允许导入功能子集的库非常有用。

例如,常见的库结构可能是:

bash
./tablet
  |-- index.styl
  |-- vendor.styl
  |-- buttons.styl
  |-- images.styl
./tablet
  |-- index.styl
  |-- vendor.styl
  |-- buttons.styl
  |-- images.styl

在下面的例子中,我们设置 paths 选项来为 Stylus 提供额外的路径。在 ./test.styl 中,我们可以 @import "mixins/border-radius",或者 @import "border-radius"(因为 ./mixins 对 Stylus 是可见的)。

js
/**
 * 模块依赖。
 */

var stylus = require('../')
  , str = require('fs').readFileSync(__dirname + '/test.styl', 'utf8');

var paths = [
    __dirname
  , __dirname + '/mixins'
];

stylus(str)
  .set('filename', __dirname + '/test.styl')
  .set('paths', paths)
  .render(function(err, css){
    if (err) throw err;
    console.log(css);
  });
/**
 * 模块依赖。
 */

var stylus = require('../')
  , str = require('fs').readFileSync(__dirname + '/test.styl', 'utf8');

var paths = [
    __dirname
  , __dirname + '/mixins'
];

stylus(str)
  .set('filename', __dirname + '/test.styl')
  .set('paths', paths)
  .render(function(err, css){
    if (err) throw err;
    console.log(css);
  });

Require

除了 @import 外,Stylus 还有 @require。它的工作方式几乎相同,但例外的是任何给定文件只导入一次。

块级导入

Stylus 支持块级导入。这意味着你可以在根级别以外的地方使用 @import,比如嵌套在其他选择器或 at-rules 中。

如果你有一个 bar.styl 文件,包含以下代码:

stylus
.bar
  width: 10px;
.bar
  width: 10px;

那么你可以在 foo.styl 中这样导入它:

stylus
.foo
  @import 'bar.styl'

@media screen and (min-width: 640px)
  @import 'bar.styl'
.foo
  @import 'bar.styl'

@media screen and (min-width: 640px)
  @import 'bar.styl'

你将得到这样的编译后的 CSS 结果:

stylus
.foo .bar {
  width: 10px;
}
@media screen and (min-width: 640px) {
  .bar {
    width: 10px;
  }
}
.foo .bar {
  width: 10px;
}
@media screen and (min-width: 640px) {
  .bar {
    width: 10px;
  }
}

文件通配符

Stylus 支持通配符。通过它,你可以使用文件掩码导入多个文件:

stylus
@import 'product/*'
@import 'product/*'

这将从 product 目录中导入所有的 stylus 文件,比如这样的结构:

bash
./product
  |-- body.styl
  |-- foot.styl
  |-- head.styl
./product
  |-- body.styl
  |-- foot.styl
  |-- head.styl

注意,这也适用于 @require,所以如果你还有一个 ./product/index.styl,其内容为:

stylus
@require 'head'
@require 'body'
@require 'foot'
@require 'head'
@require 'body'
@require 'foot'

那么 @require 'product/*' 将只包含每个单独的文件一次。

解析导入文件中的相对路径 URL

默认情况下,Stylus 不会解析导入的 .styl 文件中的 URL,所以如果你有一个 foo.styl 文件,其中包含 @import "bar/bar.styl",而后者有 url("baz.png"),那么在结果 CSS 中它也会是 url("baz.png")

但你可以通过使用 --resolve-url(或简写为 -r)CLI 选项来改变这种行为,以便在结果 CSS 中得到 url("bar/baz.png")

JavaScript 导入 API

当使用 .import(path) 方法时,这些导入会被推迟到评估时:

js
var stylus = require('../')
  , str = require('fs').readFileSync(__dirname + '/test.styl', 'utf8');

stylus(str)
  .set('filename', __dirname + '/test.styl')
  .import('mixins/vendor')
  .render(function(err, css){
  if (err) throw err;
  console.log(css);
});
var stylus = require('../')
  , str = require('fs').readFileSync(__dirname + '/test.styl', 'utf8');

stylus(str)
  .set('filename', __dirname + '/test.styl')
  .import('mixins/vendor')
  .render(function(err, css){
  if (err) throw err;
  console.log(css);
});

以下语句...

stylus
@import 'mixins/vendor'
@import 'mixins/vendor'

...等同于...

stylus
.import('mixins/vendor')
.import('mixins/vendor')

Released under the MIT License.