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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 最近在折腾的时候又想写less了,但是换框架了,成了thinkjs,考虑到开发阶段一直编译编译less的情况..最终根据middleware的特点实现了一个超级简单的less中间件。

最近在折腾的时候又想写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

  • root : Root directory to find less file .
  • target : Root directory to place css file .
  • lessOptions : Options of Less.js

源码

代码也很简单,直接使用的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();
    }
}
相关文章
|
4月前
|
小程序 中间件 PHP
laravel5.8(六)中间件(middleware)
中间件,第一次听到这个名字感觉好陌生,这是个啥呀,第三方插件?好像不是。之前也没有遇到过这个玩意啊。 之前使用到的thinkphp5.0以及Yii2.0框架都是没有中间件这一说的。 去thinkphp官网查了一下,要到thinkphp5.1.6才开始支持中间件。实现的方式基本上就是仿照laravel。 一:那么什么时中间件呢: HTTP 中间件提供了为过滤进入应用的 HTTP 请求提供了一套便利的机制。 例如,Laravel 内置了一个中间件来验证用户是否经过授权,如果用户没有经过授权,中间件会将用户重定向到登录页面,否则如果用户经过授权,中间件就会允许请求继续往前进入下一步操作。
46 0
|
6月前
|
中间件
如何开发一个 SAP UI5 Tools 的自定义中间件扩展 - Custom Middleware Extension
如何开发一个 SAP UI5 Tools 的自定义中间件扩展 - Custom Middleware Extension
74 1
|
存储 JSON 前端开发
彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-JWT和中间件(Middleware)的使用EP07
前文再续,上一回我们完成了用户的登录逻辑,将之前用户管理模块中添加的用户账号进行账号和密码的校验,过程中使用图形验证码强制进行人机交互,防止账号的密码被暴力破解。本回我们需要为登录成功的用户生成Token,并且通过Iris的中间件(Middleware)进行鉴权操作。
彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-JWT和中间件(Middleware)的使用EP07
|
中间件 数据库 Python
Django中间件Middleware简单使用
Django中间件Middleware简单使用
102 0
|
数据采集 中间件 Python
Python爬虫:Scrapy中间件Middleware和Pipeline
Python爬虫:Scrapy中间件Middleware和Pipeline
201 2
Python爬虫:Scrapy中间件Middleware和Pipeline
|
中间件
FastAPI(37)- Middleware 中间件
FastAPI(37)- Middleware 中间件
398 0
FastAPI(37)- Middleware 中间件
|
中间件
如何查找SAP CRM通过中间件Middleware连接的远端ERP系统
如何查找SAP CRM通过中间件Middleware连接的远端ERP系统
如何查找SAP CRM通过中间件Middleware连接的远端ERP系统
|
缓存 数据挖掘 中间件
利用CRM中间件Middleware从ERP下载Customer Material的常见错误
使用事务码VD51和VD52创建和修改Customer Material。 下图是我在ERP创建的Material,为其维护了一个Customer Material AOP。
108 0
利用CRM中间件Middleware从ERP下载Customer Material的常见错误
|
前端开发 中间件 .NET
ASP.NET Core 入门教程 9、ASP.NET Core 中间件(Middleware)入门
ASP.NET Core 入门教程 9、ASP.NET Core 中间件(Middleware)入门一、前言1、本教程主要内容ASP.NET Core 中间件介绍通过自定义 ASP.NET Core 中间件实现请求验签2、本教程环境信息软件/环境 说明操作系统 Windows 10SDK 2.
2037 0
|
Web App开发 JavaScript 中间件