通过thinkjs的middleware将less作为中间件进行处理

通过thinkjs的middleware将less作为中间件进行处理

月光魔力鸭

2019-12-10 16:00 阅读 744 喜欢 1 less middleware thinkjs

最近在折腾的时候又想写less了,但是换框架了,成了thinkjs,考虑到开发阶段一直编译编译less的情况..最终根据middleware的特点实现了一个超级简单的less中间件。

作用很简单,我想实现的目标也很简单,在html中正常写css链接,当时请求会被less中间件拦截,然后根据路径查找less文件,并进行编译,最终写入到目标css文件中。

这个只在开发模式下使用,生产环境不需要使用。主要就是方便使用less编写样式。 https://cdn.pixabay.com/photo/2019/12/04/23/34/sheep-4673941__340.jpg

think-less

A less middleware for thinkjs 3.0 on development enviroment. Compiler less file to css when request xxx.css file in pages.

Installation

npm install think-less --save-dev

API

Modify /src/config/middleware.js .The less middleware should before resource middleware.

const less = require('think-less');
const path = require('path');
const isDev = think.env === 'development';

module.exports = [
    {
        handle: less,
        enable: isDev ? true : false,
        options: {
            root: path.join(think.ROOT_PATH, 'res'),
            target: path.join(think.ROOT_PATH, 'www'),
            lessOptions: {
                paths: [path.join(think.ROOT_PATH, 'res')],
                compress: true
            }
        }
    }
]

Options

源码

代码也很简单,直接使用的less的模块进行编译,如下:

//thinkjs middleware of less compiler
const less = require('less');
const path = require('path');
const fs = require('fs');
const mkdirsp = require('mkdirsp');

module.exports = (options,app)=>{
    return async (ctx,next)=>{
        let extname = path.extname(ctx.path);
        if(extname.toLowerCase() != '.css'){
            return next();
        }
        let filePath = path.join(options.root,ctx.path.substr(0,ctx.path.indexOf('.css'))+'.less');
        let targetPath = path.join(options.target,ctx.path);
        if(!fs.existsSync(filePath)){
            return next();
        }
        let content = Buffer.from(fs.readFileSync(filePath)).toString('utf8');
        try{
            await mkdirsp(path.dirname(targetPath));
            let out = await less.render(content,options.lessOptions)
            fs.writeFileSync(targetPath,out.css);
        }catch(e){
            return Promise.reject(e);
        }
        return next();
    }
}

转载请注明出处: https://chrunlee.cn/article/think-js-less-middleware.html


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
产品版本更新的时候经常会有一些数据库的差异,如果版本管理好的话,一步一步升级即可.. 但是如果好久没更新的话,还是有很多不确定的,只能挨着比对表和字段。比对了一次就烦了,写了这么一个工具,查询差异表和字段并给出sql语句。
近期有个小工具,需要使用到本地数据库,想使用sqlite ,本来以为是个手到擒来的活... 没成想卡在了开始上。
在日常开发中,经常会频繁的做一些重复性的操作,作为一名程序员,解放双手的时刻到了
最近一直在围绕着我的小电脑在转,基本都是这方面的问题。在没有公网IP的情况下,这个问题就是我怎么才能通过域名访问到我家中的服务器。
最近看到知乎上一话题:微信公众号文章里的视频怎么下载?。看还是有很多人推荐啥工具啊,很是捉急,当然本次的主题也是通过程序来获取内容,但是目前来说仅仅是娱乐吧。
也不知道咋回事 ... 哈哈,忽然想研究下磁力网站,其实并不是很想懂里面的原理,只是搞不明白他们的资源是从哪里来的..很是纳闷?
之前在知乎上有看到,基本上都是一致的,这里提供一个nodejs版本的针对微信内dat文件进行处理恢复为图片的方法。
从豆瓣转到网易云后,发现了不少好听的歌曲,然鹅..当我想把这些歌拿下来扔车上听的时候发现竟然不允许下载..能听不能下?这不科学,作为一名程序猿,必然要迎难而上啊.