最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 小程序框架工程构建学习之使用less(01)

    正文概述 掘金(码克吐温)   2021-08-21   561

    这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

    首先,我们新建一个小程序项目,它的结构目录如下:

    小程序框架工程构建学习之使用less(01)

    对于习惯了web开发的我们来说,先从最简单的一个痛点需求出发:原生wxss写样式太不方便了,我要用less编写样式代码,如何做?

    项目准备

    新建一个文件夹,比如就叫mini-demo,我们先将上面新建的初始化小程序的代码中所有的样式文件wxss后缀改为less,然后拷贝到mini-demo -> src的目录下,并在根目录下npm init创建一个package.json文件,后面会安装各种构建依赖包。

    通常来说,使用less都会创建variables.less及mixins.less文件,目前我想将这两个less样式文件约定,统一放到src目录下叫做styles的文件夹中,然后在工程构建中将这两个文件内容逐一添加进各个样式文件中。

    小程序框架工程构建学习之使用less(01)

    到此,项目准备工作已经完成,接下来我们要做的就是构建工程代码实现:

    1. 监听src目录下的less样式文件改动,实时将less文件编译成css,并将文件后缀名重新改为wxss
    2. 将src文件整体输出到dist目录

    创建build.js

    在根目录下创建build.js,并在package.json script中添加脚本

    "dev": "node build.js",
    

    后续我们通过npm run dev方式启动运行构建代码

    编写build.js构建脚本

    首先,启动npm run dev后,我们要实现:

    1. 文件监听功能,npm包:chokidar
    2. 文件操作的功能(如将src目录下文件移动到dist目录),npm包:fs-extra
    3. less编译:npm包:less
    4. 处理样式,npm包:postcss

    以上相关包的用法请自行查阅文档,下面直接上代码,配合注释不难阅读:

    build.js

    const chokidar = require('chokidar');
    const fs = require('fs-extra');
    const postcss = require('postcss');
    const less = require('less');
    const path = require('path'); // node 自带的,无需安装依赖包,直接引入即可
    
    async function dev() {
      // 对不同文件进行不同的处理,这里暂时只实现对样式文件的处理 
      const cb = (filePath) => {
         if (/\.less$/.test(filePath)) {
          processStyle(filePath);
          return;
        }
        // 将文件拷贝到dist目录
        fs.copy(filePath, filePath.replace('src', 'dist'));
      }
      
      chokidar
        .watch(['src'], {
          ignored: ['**/.{gitkeep,DS_Store}'],
        })
        .on('add', (filePath) => {
          // 监听到有新的文件添加进来执行的逻辑
          
          // styles 文件夹下的less样式文件不会打包进dist目录
          if (filePath.includes(path.join('src', 'styles'))) return;
          cb(filePath);
        })
        .on('change', (filePath) => {
          // 文件内容改变触发的逻辑
          console.log('change file: ' + filePath)
    
          if (filePath.includes(path.join('src', 'styles'))) {
            // 重新编译样式文件
            recompileStyles();
            return;
          }
    
          cb(filePath);
        });
    }
    
    // 样式文件处理
    async function processStyle(filePath,) {
      let source = await fs.readFile(filePath, 'utf8');
      // 在pages文件下的各个样式文件中注入variables和mixins定义的内容
      source =
        `@import '${path.resolve('src/styles/variables.less')}';\n` +
        `@import '${path.resolve('src/styles/mixins.less')}';\n` +
        source;
    
      // 将less编译为css  
      const { css } = await less.render(source, {
        filename: path.resolve(filePath),
      });
    
      // postcss可以利用各种插件对css内容进行处理,这里先暂时不用
      const { css: wxss } = await postcss().process(css, { map: false, from: undefined });
    
      // 修改less后缀为wxss并且将文件输出到dist目录
      const destination = filePath.replace('src', 'dist').replace(/\.less$/, '.wxss');
      
      await fs.copy(filePath, destination);
      fs.writeFile(destination, wxss);
    }
    
    // 由于styles目录下的文件修改可能影响多个文件,所以重新遍历编译一遍所有页面样式文件
    function recompileStyles() {
        const watcher = chokidar.watch(['src/**/*.less', '!src/styles/**/*']);
        watcher.on('add', (filePath) => {
          processStyle(filePath);
        });
        watcher.on('ready', () => watcher.close());
    }
    
    dev()
    

    现在我们往styles目录的文件中增加测试数据

    variables.less

    @blue: blue;
    

    mixins.less

    .backgroundBlue() {
      background: @blue;
    }
    

    打开src -> page -> index.less,我们往里面添加

    .test {
      .testone {
        .backgroundBlue()
      }
    }
    

    最后运行npm run dev,可以看到dist目录成功生成:

    小程序框架工程构建学习之使用less(01)

    点开index.wxss,可以看到less文件成功编译:

    小程序框架工程构建学习之使用less(01)

    源码地址

    仓库源码以序号对应每篇文章源码


    起源地下载网 » 小程序框架工程构建学习之使用less(01)

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元