使用gulp构建微信小程序工作流(代码片段)

mthz mthz     2022-12-19     798

关键词:

前言

刚入门微信小程序的时候,一切都基于微信web开发者工具,没有使用其他框架,也没有工程化的概念。当时做的项目都比较简单,单单用微信web开发者工具倒也得心应手。学了些东西后,就按捺不住地想跳出原生工具的条条框框,把近些日子学的东西都拿出来熬一熬。

已有的一个小程序项目使用了github上一个使用webpack、babel、sass开发的小程序脚手架(wxapp-boilerplate),我需要在不变动原有项目代码的基础上,使用gulp来重构项目的工作流。

使用体验:使用vscode配合各种插件在src目录下开发,使用微信web开发者工具预览调试,通过cmd打开服务,可以用gulp命令快速创建page、component模板。还是很nice的。

介绍

根据开发中的刚需和痛点,最终做了以下工作,有实现不到位的,欢迎大家提出建议。

sass编译成wxss,同时处理了@import直接导入导致单文件过大的问题
修改gulpfile.js的aliasWords可为项目js配置alias
支持在src中的wxs使用es6+
使用微信web开发者工具的Npm构建
gulp命令快速创建page、component模板

项目地址:https://github.com/bluehat999/weapp-gulp

文章地址:https://www.cnblogs.com/mthz/p/weapp-gulp.html

要点

实现过程中遇到的问题,也是一些要点:

1.项目中的WXS文件使用了ES6语法,而WXS原生不支持ES6

wxs不支持ES6 语法,其标准基本是参考ES5 标准.
解决方案是使用babel将wxs像js那样从ES6转为ES5,在使用babel的时候,有个模块始终无法加载到,查出问题应该是babel的依赖间版本不一致的问题,就在github上查了gulp-babel的仓库,参照readme.md的示例重新安装模块和使用,就成功解决。

安装:

  npm install --save-dev gulp-babel @babel/core @babel/preset-env

使用:

  const f_wxs = done => 
      return gulp.src(WXS,  since: gulp.lastRun(f_wxs) )
          .pipe(plumber( errorHandler: onError ))
          .pipe(babel(
            presets: ['@babel/preset-env']
          ))
          .pipe(rename(extname:'.wxs'))
          .pipe(gulp.dest(DIST))
  
  gulp.task('wxs', f_wxs)
2.sass编译成wxss,解决@import导致文件体积过大的问题

css不支持import语法,sass在处理@import时会直接把对应文件添加过来,从而导致wxss文件体积过大。

而wxss支持import语法,同时限制了单包代码不超过2M,所以需要采用方法避免sass编译时直接导入样式,而是沿用@import。简单来说,就是让sass编译时不处理import语句。

可以改sass的源码,让它跳过import,也可以在交给sass编译前将文件中的import语句注释掉,编译结束后再取消注释。

但是不处理import语句也会带来一个问题:文件中使用了引入文件中的变量和mixin时,会由于没有引入而找不到变量和mixin。我们需要再给不处理import语句加一个判断条件。

一般项目都会将全局的(需要被引用的)变量和mixin放在单独的文件里,而且会适当分成多个,以免单个文件过大。将这些文件放在指定的目录里,将目录路径作为判断条件来过滤掉需要import的变量和mixin的sass文件。

const SRC = './src/**/'
const SASS = [`$SRC*.scss,wxss,scss`]
const DIRECTIMPORT = [`styles`, `font`]

const f_sass = done => 
    return gulp.src([...SASS,...DIRECTIMPORT.map(item => `!$SRC$item/**/*`)], 
                     since: gulp.lastRun(f_sass) ,allowEmpty:true)
        .pipe(plumber( errorHandler: onError ))
        .pipe(tap((file) => 
            const filePath = path.dirname(file.path);
            file.contents = new Buffer(
                String(file.contents)
                .replace(/@import\\s+['|"](.+)['|"];/g, ($1, $2) => 
                    const imPath = path.resolve(filePath + '/' + $2)    
                    return DIRECTIMPORT.some( item =>  return imPath.indexOf(item) > -1 ) ? $1 : `/** $$1 **/`
            )
            )
        ))
        .pipe(sass())
        .pipe(replace(/(\\/\\*\\*\\s0,)(@.+)(\\s0,\\*\\*\\/)/g, ($1, $2, $3) => $3.replace(/\\.scss/g, '.wxss')))
        .pipe(rename( extname: '.wxss' ))
        .pipe(gulp.dest(DIST))

gulp.task('sass', f_sass)
3.微信小程序使用npm

小程序基础库2.2.1以上的版本开始支持npm安装第三方包。官方文档

仔细读了文档,和它的示例代码,不过还是被坑了一会。

node_modules必须放在小程序根目录或其子目录下,npm的package.json也是,否则在微信web开发者工具对dist进行npm构建时会提示找不到npm。

它的npm构建会在代码同级目录生成source map文件,方便做逆向调试。

不过npm的命令是需要在dist目录的上一级使用的,如果直接放在dist里,上一级就用不了,本来理想的方案是放在dist、修改npm寻找node_modules文件的地点,或者放在上一级、修改开发者工具构建时寻找node_modules文件的地点。

但是我实在没查到如何修改,也许看源码可以,所以采用了比较麻烦的方案。就是node_modules放在上一级,写一个gulp task将它整体复制到dist。node_modules毕竟挺大的,复制一份要用去10几秒,开销挺大,不过也只有node_modules更新了需要同步一下,总的来说也还好。

4.使用gulp-tap获取处理的文件名时并计算一个相对路径

原有项目使用了webpack来管理文件依赖,改用gulp的话,原有的一些依赖路径就是错误的,(比如引用config和utils目录下的文件时),如果直接修改代码,会和项目原有的编程习惯冲突,所以决定直接在gulp构建时来把错误的路径改为正确的相对路径。

5.微信小程序中使用lodash报错
Uncaught TypeError: Cannot read property 'prototype' of undefined

找到一篇解释的很好的文章

按照文章中给出的方案,在开发者工具中构建Npm后,可使用gulp lodash自动修改相应文件来修复这个问题。

6.微信小程序不支持async / await 语法

因为小程序支持ES6转ES5,我就没有在gulp中使用babel,没考虑到小程序对ES6以上的特性不支持。

技术图片

小程序报了上诉错误,我首先查了一下regeneratorRuntime is not defined的错误,大致得知是异步的错误,找到报错的代码,发现使用了async await,猜测是微信小程序不支持,需要引入相应的包,然后google到了比较好的答案。

facebook代码仓库下载到了相应源码(只需要runtime.js就可以了),放入utils中,在使用了async的地方引入。不过我又遇到了下面的问题:

技术图片

源码中报错部位在catch中,文件中既没有引入也没有定义这个Function,在网上也找不到答案,考虑在catch中,应该是处理报错之类的,注释掉也影响不大,我就把它注释掉了。

技术图片

更多改进

改进一定会有的,如果觉得还行或者不行,劳烦关注一下我的博客和github。

项目地址:https://github.com/bluehat999/weapp-gulp

文章地址:https://www.cnblogs.com/mthz/p/weapp-gulp.html

gulp的使用流程(代码片段)

GULP的使用流程Gulp是基于node.js的一个前端自动化构建工具,开发这可以使用它构建自动化工作流程(前端集成开发环境)。使用gulp你可以简化工作量,让你把重点放在功能的开发上,从而提高你的开发效率和工作质量。一、建... 查看详情

gulp构建工作流(代码片段)

gulp构建工作流以及gulpfile.js文件###步骤:1.命令行创建npm的配置文件a.npminit(这时候生成一个package.json的文件)2.添加一个gulp的依赖npminstallgulp--save-dev3.在项目根目录下添加一个gulpfile.js文件,这个是gulp的主文件,这个文件名是... 查看详情

gulp自动化构建的基本使用(代码片段)

...自动化,从而减少你所浪费的时间、创造更大价值。基本使用安装gulpnpmigulp-D在项目根目录下创建gulpfile.js文件functiondefaultTask(cb)//在此处写默认任务的代码cb() 查看详情

gulp自动化构建工具的使用(代码片段)

...载安装:  cnpm:cnpmigulp-g  如果cnpm安装有问题:可使用yarn安装  yarn:  yarnglobaladdgul 查看详情

微信小程序组件库开发记录(代码片段)

微信小程序组件库开发记录背景前言技术选型环境搭建安装gulp将`scss`编译为`wxss`压缩`wxml`,`js`,`json`文件和图片拷贝文件到另一个目录删除目录整合创建组件模板开发技巧properties父组件给... 查看详情

gulp基本用法(代码片段)

...l一、简介1.gulp.js是一个前端构建工具,与gruntjs类似。gulp使用node中的stream来读取和操作数据,其速度更快。eg:每次修改代码都要做的编译ES6、sass、压缩html这些重复性工作。gulp脚本就是为了减少重复性工作而做的工作。2.与grunt... 查看详情

gulp(自动化构建工具)(代码片段)

...完成这些重复性很强的工作。Gulp可以帮助我们用自动化构建工具增强你的工作流程!好了,废话不多说了。既然要了解Gulp,就得先安装它。Gul 查看详情

微信小程序使用npm教程(代码片段)

首先打开工具-详情-勾选使用npm模块 使用npm的步骤:1.安装npm包在小程序package.json所在的目录中执行命令安装npm包:npminstall此处要求参与构建npm的package.json需要在project.config.json定义的miniprogramRoot之内。tips:开发者工... 查看详情

vant组件之构建npm过程记录(微信小程序)(代码片段)

F:\\COMPUTER\\miniprogram>npminstallAcompletelogofthisruncanbefundin:C\\Users\\用户\\AppData\\Roaming\\npm-cache_logs——解决办法:重新创建新的文件夹miniprogramF:\\COMPUTER\\miniprogram>npminitThisutilityw 查看详情

微信小程序工具类(代码片段)

wechat-common-sdk?场景:目前工作中的项目需要包含并使用另一个项目。也许是第三方库,或者你独立开发的,用于多个父项目的库。现在问题来了:你想要把它们当做两个独立的项目,同时又想在一个项目中使用另一个。我们举一... 查看详情

微信小程序13(自定义组件)(代码片段)

...自定义组件1.1.1.声明组件1.1.2.编辑组件1.1.3.注册组件1.2.使用自定义组件小程序允许我们使用自定义组件的方式来构建页面。自定义组件1.1.创建自定义组件类似于页面,一个自定义组件由jsonwxmlwxssjs4个文件组成1.1.1.声明组件... 查看详情

微信小程序零基础学|小程序语法(代码片段)

...,只有掌握了常用的语法,我们才能得心应手地使用代码完成页面的构建。文章目录4.1 WXML语法4.1 查看详情

微信小程序协同工作和发布数据绑定(代码片段)

目录🍘协同工作和发布-小程序成员管理1.成员管理的两个方面2.不同项目成员对应的权限 3.开发者的权限说明4.添加项目成员和体验成员🍍协同工作和发布-小程序的版本1.软件开发过程中的不同版本2.小程序的版本🍓... 查看详情

gulp(代码片段)

...站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成;使用她,不仅可以很愉快的编写代码,而且大大提高我们的工作效率。项目构建是指项目上线之前对项目源代码进行一系列处理,使其以最佳的... 查看详情

gulp介绍及常用插件使用方法(代码片段)

gulp是前端开发过程中对代码进行自动化构建的利器。它不仅能对资源进行优化,而且在开发过程中能够通过配置自动完成很多重复的任务,让我们可以专注于代码,提高工作效率。一、API介绍gulp常用的API只有四个:gulp.task(),gulp... 查看详情

微信小程序(代码片段)

开发小程序所需的基本技能 关于小程序的介绍和使用场景这里不作介绍,这个系列的文章会一步一步地带领大家快速地学习和掌握小程序的开发。关于还没有接触过小程序的开发者来说,最关心的问题无非就是,开发小程序... 查看详情

uniapp开发微信小程序,从构建到上线(代码片段)

前言:    本文主要介绍uniapp的基础使用,以及使用uniapp在企业开发的过程中的一个详细流程,比较适合第一次使用uniapp开发微信小程序的伙伴,或者没有过实战经验的小伙伴参考;使用Hbuildx配合Uniapp框架... 查看详情

微信小程序:npm更新版本(vantweapp为例)(代码片段)

VantWeapp轻量、可靠的小程序UI组件库首先你已经使用了npm构建项目打开终端,可以在微信开发者工具内直接使用输入npmlist命令查询现在系统安装的版本,如下图所示:输入npmviewvant-weappversions命令查询服务器现在有的va... 查看详情