文章图片
前言
书接上回
我们知道 uni-app 和 tarojs 在最终打包成小程序运行的时候 , 都是使用的 webpack , 所以在这 2 个框架中 , 我们可以使用 *-loader 轻而易举的赋予它们这方面的能力 。
但是 , 假如我们使用的是原生开发呢?
原生开发的选项
使用微信开发工具的小伙伴们 , 肯定注意到 , 在 项目详情 -> 本地设置 中
有上传代码时 样式自动补全自动压缩样式 自动压缩混淆 等等选项 。它们的本质 , 不过是几个插件罢了:
样式自动补全 -> autoprefixer
自动压缩样式 -> cssnano
自动压缩混淆 -> uglify-js/terser
所以我们完全可以自定义 , 以获得更强更自由的能力 。
最小化的自定义样式工具链
1. Scss与Postcss支持
我们知道 在 webpack 里 sass-loader postcss-loader babel-loader 这类 , 只是编译核心们和 webpack 做粘合的胶水代码 。
在不使用 webpack gulp rollup ... 这类的打包工具的情况下 , 我们当然可以去自定义一个最小化的样式编译工具 。
首先 , 直接安装 dart-sass和 postcss
yarn add -D sass postcss
安装后 , 可以看到 sass 渲染函数签名
// sass函数签名export function render(options: Options callback: (exception: SassException result: Result) => void): void;export function renderSync(options: Options): Result;
然后我们又知道 webpack 的 loader 选择了 compose 方式的执行方式 。
于是我们知道了执行顺序 , 那么就可以确定 *.scss 文件 , 先交给 sass 处理 , 再交由 postcss 处理 然后就直接打成 xxpage.wxss 这类 局部页面样式 又或者打成 app.wxss 作为全局样式 。
函数式编程中 compose 从右到左执行 pipe 从左到右执行
那么写代码实现就是探囊取物了:
// 不考虑 preset merge的情况下const sass = require('sass')const postcss = require('postcss')const { plugins = require('./postcss.config.js')function handleScss (path) { sass.render({ file: path // fiber: Fiber (err result) => { if (err) { console.error(err) const destPath = path.replace(/\\.scss$/ '.wxss') postcss(plugins).process(result.css { from: path to: destPath ).then(result => { fs.writeFile(destPath result.css () => true) if (result.map) { fs.writeFile(destPath + '.map' result.map.toString() () => true) ) )
上面这段代码就是 scss -> postcss -> wxss 的转化链路
而且还可以在里面 , 随意的装 postcss plugin 比如 autoprefixer cssnano tailwindcss 之前笔者写的 tailwindcss-miniprogram-preset 也可以无缝的嵌入这套机制中去 , 给原生小程序使用 。
2. 文件监控
我们开发的时候 , 会经常去创建 , 修改 , 删除文件 , 这么获取到这些 timing 对文件进行重新编译呢?
fs.watch , fs.watchFile 固然可以 , 不过更推荐的还是 chokidar
在 chokidar 的 README.md 中详细介绍了它的优势 , 这里不再叙述 。
yarn add -D chokidar
const watcher = chokidar.watch(`${someGlob` { ignored: /(^|[\\/\\\\
)\\../ persistent: true)// EventEmitter 的写法把监控安排的明明白白watcher .on('add' (pathstats) => { // 添加文件 ) .on('change' (pathstats) => { // 修改文件 ) .on('unlink' (pathstats) => { // 删除文件 ) .on('error' error => { // 发生错误 ) .on('ready' () => { // watch ready after add files )
- 良渚古城|高分子材料巧用等离子体表面处理技术可增强胶粘性。
- 阿里巴巴|任正非:华为有700多个数学家、800多个物理学家、120多个化学家
- 阿里巴巴|互联网公司不敢赚钱?阿里腾讯十年来净利润首亏损,该换挡了?
- rtx3060|红米K50游戏增强版曝光,天玑9000处理器,明年年初发布
- 阿里巴巴|电商新战局下,阿里向左,京东向右
- 阿里巴巴|阿里巴巴:企业数据资产管理实践,附266页PPT下载
- 阿里巴巴|多账号运营如何防止关联技巧分享
- 阿里巴巴|阿里三天跌掉4800亿,超过小米总市值,与腾讯差了14000亿
- 阿里巴巴|Toit 编程语言现已开源
- 阿里巴巴|如何看待口碑营销