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

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

月光魔力鸭

2019-12-10 16:00 阅读 823 喜欢 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


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
目前了解的有两个模块可以实现二维码的模块,一个是node-qrcode ,这个算是比较大众的,不过环境比较复杂,所以...连看都没看;还有一个是小众的 qr-image ,这个比较简单,没有其他环境依赖,安装即可用,因为要实现一个简单的在线二维码生成,就先用这个试试水了
最近由于系统需要一些数据进行测试,但是正常的流程都是下载pdf ,打印pdf,然后通过涂写答题卡,将涂写的扫描上传..太麻烦了,想做成简单点,通过程序直接生成..卡在了pdf转图片上,今天抽空找了下库,通过gm可以将pdf转为图片,起码第一步已经实现了,后边的涂学号之前已经做过了。
在我们做运维或者小工具的时候,总会有些需要提醒的事情,比如服务器宕机或者天气提醒,但是发email又会不够及时或者可能会忽略,那么短信就是一个不错的选择了
前段时间做了个微信小程序反编译的小东西,不过因为功能不全,没加分包处理,正好处理下加上,又考虑到后续可能的更新情况,准备上手增加下更新功能。
当我们想实现一个自己的库或模块后,发布的话,需要发布到npm上才能下载。以下是具体步骤
最近有客户提出了这么一个需求:微信dat文件在解码后的图片无法按照时间进行排序。 是的,解码后的文件的时间都是解码的时间,由于软件比较多,当时没做自动更新,所以在这里做一个小工具,可以将对应的解码后的图片的时间修改为微信dat文件对应的时间
前段时间学习到了nodejs的net模块这部分,正好想实现一个局域网内的文件下载小demo,噔噔噔噔... 兴趣推动 ,马上搞一搞。
对于开发来说,看到别人家的小程序都这么靓,这么顺畅,这么好用,用户又多... 自然是眼馋的..用户馋不来,可以先馋他的身子..啊不,代码啊。