我的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. 【百度地图API】今日小年大进步,齐头共进贺佳节——API优化升级上线,不再增加内存消耗

    原文:[百度地图API]今日小年大进步,齐头共进贺佳节--API优化升级上线,不再增加内存消耗 任务描述: 今天是2011年01月26日,小年夜.百度地图API在小年夜献给广大API爱好者一份给力的礼 ...

  2. centos7看电影

    sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm sudo rpm ...

  3. .net mvc4 从客户端中检测到有潜在危险的 Request.Form 值

    [ValidateInput(false)] 即可, 网上说什么Web.Config 里面改,一点用都没有 [HttpPost] [ActionName("Edit")] [Val ...

  4. style中position的属性值具体解释

    Position的英文原意是指位置.职位.状态.也有安置的意思.在CSS布局中,Position发挥着非常关键的数据,非常多容器的定位是用Position来完毕. Position属性有四个可选值,它 ...

  5. JavaScript随记汇总

    1.<script>标签嵌套,浏览器无法正常解析的问题: 百度知道回答 <script>FTAPI_slotid = 1007894;FTAPI_sync = true< ...

  6. PHP版本的区别

    原文:PHP版本的区别 以为这个已经写过了,发现没有,赶紧补充下. PHP的版本,自从进入5以后,发布新版本速度明显提升很多,从PHP5.2开始,5.3 .5.4 .5.5,就快要6.0了. 注:ec ...

  7. 第4章2节《MonkeyRunner源码剖析》ADB协议及服务: ADB服务SERVICES.TXT翻译参考(原创)

    天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 MonkeyRunner>书籍“.但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在 ...

  8. 使用OpenCV玩家营造出一个视频控制(没有声音)

    说明:OpenCV计算机视觉库,所以使用的图像或视频处理,因此,没有任何声音在播放视频的临时 软件:使用OpenCV制播放器(无声音) 功能说明:新建播放窗体.加入进度条能够拖动视频播放. 流程图: ...

  9. 图解IntelliJ IDEA v13应用服务器的运行配置

    初步了解IntelliJ IDEA v13应用服务器以后,接下来我们将继续设置应用服务器的运行配置. Artifacts是IDE在通过运行配置时部署的一个服务.Artifacts包括名称.类型.输出目 ...

  10. HTML5学习资源

    http://www.silverlightchina.net/html/HTML_5/study/ 我们一起学:HTML5标签系列教程(一)-video标签 版权声明:本文博客原创文章.博客,未经同 ...