Alice

写样式的更好方式

alice

构建模块和样式库

More power comes more responsibility. 「 Spider Man 」2012

我相信,只是复制几个 Html 结构一定不是你的追求,Alice 可以让你做得更多。本页略长,请坐稳。


工具准备

本文默认在 Linux\Unix 环境下运行,在开始之前,我们先需要安装几个重要的工具。 若对这些工具的作用不了解,可以先阅读 工具

遇到 sudo 的问题请参考这里

安装 spm

$ npm install spm -g

Alice 已全面迁移到 spm3 上。

开发一个样式模块

我们的页面中总是存在的各式各样的模块化的 DOM 结构, 都可以依据其复用度来把其中一部分代码提炼成样式模块。

初始化模块

现在我们要开发一个 box 区块模块。首先建立一个文件夹,并使用 spm init 命令进行初始化。

$ mkdir alice-box
$ cd alice-box
$ spm init
Creating a spm package:
[?] Package name: alice-box
[?] Version: 0.0.0
[?] Description: my box style
[?] Author: afc163 <afc163@gmail.com>
Initialize a spm package Succeccfully!

这时程序会让你输入相关的信息,生成一个模块的初始目录结构如下。

README.md
HISTORY.md
package.json
index.js

其中 HISTORY.md 用于版本的升级记录, README.md 是用来写文档和 DEMO 的地方,package.json 则存放模块的基本信息。我们这是一个样式模块,手动把 index.js 改为 box.css ,并把 package.json 中 spm.main 字段改为 index.css

我们可以在 package.json 中的 spm 字段中的 dependencies 填写所需的依赖的别名。 这个 box 模块不需要依赖所以不需要填写。

写文档和设计 Html 结构

我们先打开 README.md 进行编辑。

# box

---

带边框和标题的标准区块。

---

## 演示文档

<link type="text/css" rel="stylesheet" media="screen" href="box.css">

### 默认用法

````html
<div class="ui-box">
    <div class="ui-box-head">
        <div class="ui-box-head-border">
            <h3 class="ui-box-head-title">区块标题</h3>
        </div>
    </div>
    <div class="ui-box-container"></div>
</div>
````

可以看到我们在上面写了基本的模块描述,并引入了样式源文件,在最下面设计了 box 模块的 Html 结构。 这和 JS 模块的开发过程是类似的,先设计文档和接口再进行开发,而对于样式模块来说,Html 结构就是样式的接口。

像上面使用四个 ```` 符号来包裹代码是 nico 的特性,这样可以把代码片段转换成实际的 DOM 结构,非常方便调试和文档生成。

编码和调试

接下来我们打开 box.css 进行编辑,现在就是熟悉的样式编码阶段了。 在这个阶段,我们可以到项目目录运行 spm doc 来打开 spm doc 的调试功能, 程序启动一个 livereload 服务监听生成的文档页面,我们可以用浏览器打开 http://127.0.0.1:8000 访问文档页面并进行调试。你会看到类似下图的页面。

构建和发布

开发测试完毕后,我们就可以通过一下目录构建出标准的 Alice 模块文件了。

$ spm build

这个命令会生成一个 dist 目录,里面存放我们构建出来的样式文件。它会读取 package.json 中 spm 字段下的 main 字段来输出用户指定的文件。

$ spm publish

再通过 publish 命令可以把样式模块上传到源中,这样其他模块就可以依赖这个模块了。

源码托管和文档部署

最后,建议你将这个目录提交到 github 或 gitlab 中,统一管理你的样式模块。一个版本开发构建完成后,用版本号来打一个 tag 。 还可以利用 源服务器 来部署模块的文档页面。

比如要把这个模块的静态文档托管到 spmjs.io 上,开发完毕后然后在模块根目录运行:

$ spm doc publish

这样可以发布页面到对应的源服务中,默认的地址为 http://spmjs.io/docs/{{name}}。 就可以访问 http://spmjs.io/docs/alice-box 来访问对应的文档页了。

注意:要使用 spmjs.io 的文档服务,你需要有这个模块的发布权限。

开发某页面的样式

这里你将会知道如何依赖和打包 alice 模块。

假设我们现在收到了一个 我的支付宝 页面的开发需求, 拿到 psd 稿后我们发现这个页面上有很多的 alice 通用模块,同时也有很多的个性化的样式需求。

这时会需要一个我的支付宝的样式模块,命名为 myalipay ,操作步骤和上面的 box 模块类似。 在 Alice 中,一切样式皆模块,所以这个 myalipay 其实和上面的 box 没有本质区别, 只不过它是直接用在页面上的。

生成目录后,我们打开 myalipay/package.json 文件,编辑其中的 spm.alias 字段。假设我们需要 用到 alice.box、alice.nav、alice.button 三个模块。

{
  "name": "myalipay",
  "version": "1.0.0",
  ...
  "spm": {
    "dependencies": {
      "alice-box": "1.0.0",
      "alice-button": "1.0.0",
      "alice-nav": "1.0.0"
    },
    output: ["myalipay.css"]
  }
}

其中 dependencies 字段指明了依赖的模块的别名,output 字段指明了需要打包的目标文件, 然后打开 myalipay.css ,在文件前面写入

@import url('~alice-box');
@import url('~alice-button');
@import url('~alice-nav');

通过这种类似于 Arale 中 require('') 的方式,引入了这三个模块。 在调试页面,文档生成工具会自动把所需依赖的外部样式模块引入。

接下来可以在 myalipay.css 的后面继续编写个性化的样式代码。

当然可以引入内部的模块,比如我们在根目录下建一个 user.css 文件,专门用来写和用户有关的样式。 在 myalipay.css 中可以这样引入:

@import url('~alice-box');
@import url('~alice-button');
@import url('~alice-nav');

@import url('./user.css');  /* 引入内部文件 */

~ 表示引入外部模块,不加表示内部文件。

最后,和上面一样,用 spm build 命令打包出文件,你会发现在 dist 目录下多了 两个文件 myalipay.css 和 myalipay-debug.css ,包含了 box、button、nav、user.css 和 myalipay.css 自身的所有代码。 最后把 dist 下的文件部署服务器上并用 link 来引入就可以了。