我的LESS编译方案

2013-08-07 10:22 by 逆风之羽, 469 阅读, 2 评论, 收藏编辑

背景

近期项目前端决定使用less,简单介绍一下,详细信息有兴趣查看官方文档(http://www.lesscss.net/article/home.html

LESSCSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS的语法,为CSS的赋予了动态语言的特性,如变量、继承、运算、函数等,更方便CSS的编写和维护。

简单来说,它自定义了一套语法规则,在css中提供公共变量的抽取,简单的函数运算等功能,最终通过编译器或解析器将其编译或解析为相对应的css代码。

但是LESS文件在何时编译成为一个值得关注的问题,按照常规方式由几种方案

1、前端人员手工将less文件编译为css,并在页面引入css文件

这种方案前端人员工作量会比较大,同时维护less文件和css文件,多人编辑同一个文件时很容易出错,并且多版本并行时合并代码不方便,一点点细微的改动都要重新编译文件

2、页面引入less文件,项目编译时使用插件统一进行预编译

该方案要求所有开发人员都要安装编译环境(nodejs和less),并且文件修改后都要重新编译项目才能看到效果

3、页面引入less文件和js解析文件,在页面上将less解析为css

其实对于互联网项目来说,这种方式基本不会考虑在线上运营,执行效率太低

LESS的两种编译方式

1、页面引入js代码文件解析

首先引入less代码

<link rel="stylesheet/less" href="example.less" />

然后引入解析代码

<script src="lesscss-1.4.0.min.js"></script>

解析代码会根据rel属性类型通过ajax方式拉取less代码,然后并解析成css后追加到页面

好处:不必安装less编译环境,同样可以使用less文件
缺点:在页面上解析代码,效率较低,受机器、网络影响较大 

2、服务端预编译

官方提供了基于node.js的编译工具lessc

首先全局安装less

npm install -g less

然后直接使用less编译即可

lessc example/example.less example/example.css
优点:服务端预编译,效率高,避免客户端解析延时。
缺点:需要安装node以及less环境,并且每次修改less后都需要将其编译为css文件方可见效 

方案基本思路

鉴于上述原因,经与前端商量后决定制定一套较为平衡的方案,即:

开发环境使用方式1,不用所有开发人员安装环境,降低开发成本,避免每次修改后都编译

其他环境使用方式2,预编译less文件,提高页面加载速度

方案概括

1、通过配置文件,添加一个区分开发环境和其他环境的标志位lessOn(比如开发环境为false,其他环境为true) 
2、页面使用自定义标签引入less文件,通过区分lessOn的值来判断引入编译前的less文件还是编译后的css文件 
  这里自定义标签代码就不贴了,举个例子:
  通过自定义标签引入文件"/less/example.less",在输出到页面前判断当前如果是服务器环境将其转为"/css/example.css"  
3、页面全局通过判断lessOn的取值决定是否添加对less.js的引入 
  如果是开发环境则引入官方的js脚本用于页面解析,服务器环境则不引入  
<script src="lesscss-1.4.0.min.js"></script>
4、使用node.js编写工具脚本遍历指定目录、批量编译less文件
 

5、使用maven插件maven-antrun-plugin,在编译打包前执行第4部的脚本预编译less文件

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<phase>generate-sources</phase>
<configration>
<tasks>
<echo>
------------node less-compiler.js-------------
</echo>
<exec executable="node" dir="${project.basedir}/src/main/webapp/assets/less" failonerror="true">
<arg line="less-compiler.js ${project.basedir}/src/main/webapp/assets/less
                    ${project.basedir}/src/main/webapp/assets/css"/>
</exec>
<echo>
------------compiler success-----------------
</echo>
</tasks>
</configration>
<goals>run</goals>
</execution>
</executions>
</plugin>

总结

思路其实很简单,通过区分项目运行环境,兼得两种编译方式的优点

任何工具都不应当直接拿来使用,通过合适的定制使其更加适合自身项目开发

 
 
分类: 经验之谈
标签: lessnodejsantrun

LESS编译方案的更多相关文章

  1. Freeline--Android平台上的秒级编译方案

    Freeline 技术揭秘 Freeline是什么? Freeline是蚂蚁金服旗下一站式理财平台蚂蚁聚宝团队15年10月在Android平台上的量身定做的一个基于动态替换的编译方案,5月阿里集团内部 ...

  2. 我的LESS编译方案

    背景 近期项目前端决定使用less,简单介绍一下,详细信息有兴趣查看官方文档(http://www.lesscss.net/article/home.html) LESSCSS是一种动态样式语言,属于 ...

  3. iOS自动化编译方案

    本文主要来源以下Bryce Zhang博主的文章,感谢博主的无私分享,转载请注明出处,尊重原创 然,根据Bryce Zhang文章进行实践过程中遇到一些问题,解决后在此做相应的总结.大神请绕道,觉得低 ...

  4. CSS预编译与PostCSS以及Webpack构建CSS综合方案

    CSS全称Cascading Style Sheets(层叠样式表),用来为HTML添加样式,本质上是一种标记类语言.CSS前期发展非常迅速,1994年哈肯·维姆·莱首次提出CSS,1996年12月W ...

  5. 【转】实践最有效的提高Android Studio运行、编译速度方案

    原文:https://blog.csdn.net/xwh_1230/article/details/60961723 实践最有效的提高Android Studio运行.编译速度方案 最有效提升Andr ...

  6. Android Freeline加速编译App方案 使用和总结

    Freeline简单介绍 在Android Studio还没推出Instant Run功能之前,每次改动Android project项目时都要将整个项目又一次编译一次,然后再将资源和代码文件打包成A ...

  7. QGIS源码编译步骤详解——官方新方案

    目录 源码下载 环境下载 Cygwin64 OSGeo4W CMAKE Visual Studio 2017 环境配置 配置 编译   方案详细可见源码文件中INSTALL.md. 源码下载   QG ...

  8. C/C++的编译器|编译环境(非常全面的比较)

    C/C++编译器的一些易混淆概念,总结一下. 关于什么是Unix-like操作系统,常见操作系统间差异,什么是操作系统接口等等,请参考<操作系统宝鉴>. C/C++编译器有哪些? 首先是如 ...

  9. .NET 代码编译过程

    作为一种代码指令平台,Microsoft .NET比微软公司先前推出的其他技术平台要来得更为复杂.由于.NET提供了对多种编程语言以及(在理论上说)多重平台的支持,这就需要在传统的两个代 码层添加一个 ...

随机推荐

  1. CentOS修改用户密码方法

    CentOS修改用户密码方法 CentOS修改用户密码方法 1. 普通用户 a. 获取超级用户root权限 命令:su或者su -或者su - root b. passwd 用户名 2. 超级用户 a ...

  2. Windows下用C语言连接Mysql注意问题

    原文:Windows下用C语言连接Mysql注意问题 环境是:在VS6.0 安装Mysql后,我们需要相应的头文件以及lib文件,所以安装过程必须是完整安装.否则不会生成include文件夹哦~ 具体 ...

  3. addEventListener 与attachEvent

    第一:简单的通用方法(IE && FF) window.onload = function(){ var oDiv = document.getElementById("J_ ...

  4. animation渐进实现点点点等待效果实例页面

    CSS代码: .ani_dot { font-family: simsun; } :root .ani_dot { display: inline-block; width: 1.5em; verti ...

  5. QtNetwork说明(两)使用QT实现360的ctrl+ctrl特征

    头文字说明: <span style="font-size:18px;">#ifndef GOOGLESUGGEST_H #define GOOGLESUGGEST_H ...

  6. JavaScript语言基础知识8

    这篇文章是对前面学习的知识进行总结: 1.JavaScript支持多种数据类型,如数值类型.字符串类型.布尔类型等. 2.在JavaScript中,字符串是用引號括起来的字符系列,转义字符能够用来表示 ...

  7. 开发环境准备:Ruby on Rails开发环境配置

    开发环境准备:Ruby on Rails开发环境配置 前情回顾 上次讲到Vmware虚拟机的安装配置以及Scientific Linux 6.X系统的安装.这回我们的主要任务是在Linux操作系统上完 ...

  8. js实现多张图片同时放大缩小相对位置不变

    项目要求需要用js实现同时放大多张图片相对位置不变,就和同事去一家国外网站的js文件中跟踪扒取了这一算法, 庆幸的是算法抠出来了并整理了出来,但遗憾的只知计算过程却弄不明白算法原理: 大体上是核心运算 ...

  9. 实现基本的CRUD功能

    文] 使用 MVC 5 的 EF6 Code First 入门 系列:实现基本的CRUD功能 2014-04-28 16:29 by Bce, 428 阅读, 0 评论, 收藏, 编辑 英文渣水平,大 ...

  10. ThoughtWorks开发持续集成及部署利器:Go

    持续集成及部署利器:Go   Go是一款先进的持续集成和发布管理系统,由ThoughtWorks开发.(不要和Google的编程语言Go混淆了!)其前身为Cruise,是ThoughtWorks在做咨 ...