一条简单的命令就可以将 stylus 语法转换为 scss 语法

2020-02-26 20:16:49

一条简单的命令就可以将 stylus 语法转换为 scss 语法

因为早期有个项目用到了 stylus,stylus 开发起来很爽,但 stylus 基于缩进的代码在修改的时候不是很方便,加上所在团队开发使用的都是 SCSS ,为了便于维护和统一,准备将项目中的 stylus 替换成 SCSS。手动转换 stylus 浪费时间,且出错率大,当时在想也许别人也有这样的需求呢,所以就做了这样一个项目。请各位大佬动动你们发财的小手,给我点个 star,不胜感激。^_^

stylus-converter 配置

converter 配置

参数说明类型可选值默认值
quote转换中遇到字符串时,使用的引号类型string' / "'
conver转换类型,例如转换成 scss 语法stringscssscss
autoprefixer是否自动添加前缀,stylus 在转换 css 语法的时候,有些语法会自动添加前缀例如 @keyframesbooleantrue / falsetrue
indentVueStyleBlock在 .vue 文件中转换 stylus 时,可以添加一定数量的缩进,默认不添加缩进。numbernumber0

cli 配置

参数简写说明可选值默认值
--quote-q转换中遇到字符串时,使用的引号类型single / dobulesingle
--input-i输入名称,可以是文件或者是文件夹的路径--
--output-o输出名称,可以是文件或者是文件夹的路径--
--conver-c转换类型,例如转换成 scss 语法scssscss
--directory-d输入和输出路径是否是个目录yes / nono
--autoprefixer-p是否添加前缀yes / noyes
--indentVueStyleBlock-v在 .vue 文件中转换 stylus 时,可以添加一定数量的缩进,默认不添加缩进。number0

如何处理单行注释。

1. 先 fork 项目再 clone 项目到本地 git clone git@github.com:<your github>/stylus-converter.git 2. 进入项目目录 cd stylus-converter 3. 安装项目依赖 npm install 4. 进入 `node_modules/stylus/lib/lexer.js` 文件第 581 行。 5. 修改下列代码。 // 修改前 if ('/' == this.str[0] && '/' == this.str[1]) {   var end = this.str.indexOf('\n');   if (-1 == end) end = this.str.length;   this.skip(end);   return this.advance(); }  // 修改后 if ('/' == this.str[0] && '/' == this.str[1]) {   var end = this.str.indexOf('\n');   const str = this.str.substring(0, end)   if (-1 == end) end = this.str.length;   this.skip(end);   return new Token('comment', new nodes.Comment(str, suppress, true)) }

使用示例

// 下载 stylus-converter npm install -g stylus-converter // 运行 cli 转换文件 stylus-conver -i test.styl -o test.scss // 运行 cli 转换目录 // 先进入项目目录 mv src src-temp stylus-conver -d yes -i src-temp -o src

转换文件比较

转换前的 stylus 源码

handleParams(args...)   args @media screen and (max-width: 500px) and (min-width: 100px), (max-width: 500px) and (min-height: 200px)   .foo     color: #100 .foo   for i in 1..4     @media (min-width: 2 * (i + 7) px)

转换后的 SCSS 源码

@function handleParams($args...) {   @return $args; } @media screen and (max-width: 500px) and (min-width: 100px), (max-width: 500px) and (min-height: 200px) {   .foo {     color: #100;   } } .foo {   @for $i from 1 through 4 {     @media (min-width: 2 * ($i + 7) px) {       width: 100px * $i;     }   } }

如果你不想你转换的 @keyframes 添加默认前缀,请设置 options.autoprefixer = false

转换前的 .vue 文件

<template>   <div class="page-home">     <el-button>click me</el-button>   </div> </template> <style lang="stylus"> .page-home   .el-button     margin: 10px auto </style>

转换后的 .vue 文件

<template>   <div class="page-home">     <el-button>click me</el-button>   </div> </template> <style lang="scss"> .page-home {   .el-button {     margin: 10px auto;   } } </style>

搭建开发环境

1. 先 fork 项目再 clone 项目到本地 git clone git@github.com:<your github>/stylus-converter.git 2. 进入项目目录 cd stylus-converter 3. 安装项目依赖 npm install 4. 打包编译源文件 npm run build 5. 本地调试 cli npm link


  • 2019-06-03 00:07:32

    Android程序Crash时的异常上报

    家都知道,android应用不可避免的会发生crash,无论你的程序写的多完美,总是无法完全避免crash的发生,可能是由于android系统底层的bug,也可能是由于不充分的机型适配或者是糟糕的网络状况。当crash发生时,系统会kill掉你的程序,表现就是闪退或者程序已停止运行,这对用户来说是很不友好的,也是开发者所不愿意看到的,更糟糕的是,当用户发生了crash,开发者却无法得知程序为何crash,即便你想去解决这个crash,但是由于你无法知道用户当时的crash信息,所以你也无能为力。是否真的这样呢,其实android中有处理这类问题的方法,请看下面Thread类中的一个方法#setDefaultUncaughtExceptionHandler

  • 2019-06-04 16:40:30

    为了美观当网页图片不存在时不显示叉叉图片

    当在页面显示的时候,万一图片被移动了位置或者丢失的话,将会在页面显示一个带X的图片,很是影响用户的体验。即使使用alt属性给出了”图片XX”的提示信息,也起不了多大作用。

  • 2019-06-04 17:38:44

    PHP时间转换今天昨天前天几天前

    实际情况应该是,昨天任何时间都算一天前,前天任意时间都算2天前,所以自己琢磨了一番,去动态更新时间与今天23:59:59相差的时间秒数与86400(24 x 3600)相除后,向下取整,这样就得到了相差的天数,比如昨天00:00~昨天23:59:59的任何时间与今天的23:59:59,都相差 86400~(86400 x 2) 天,也就是2天。

  • 2019-06-04 17:44:14

    【VUE】图片预览放大缩小插件

    在看项目时,突然看到预览图片的弹窗,感觉好僵硬,不能放大,不能切换,于是便在网上找下关于图片预览的插件,有找到三个插件,具体的优劣势的看自己的使用吧,我目前只是在电脑查看效果,分别是viewerjs插件、基于photoswipe的vue-photo-preview插件以及vue-picture-preview插件 作者:北极星丶超帅的 链接:https://www.jianshu.com/p/e3350aa1b0d0 来源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 2019-06-04 21:32:05

    Android 全局Dialog的简单实现

    这里所说的全局Dialog是指无论当前应用是处于哪一个页面上,都能够及时弹出Dialog来提示用户一些信息,用户体验不会很好,一般应用于优先级非常高的通知。