问题发现

最近在用astro开发项目的时候发现astro静态资源前缀地址只支持一种前缀地址配置。
build.assetsPrefix选项中。

如果有多种情况,比如css 文件cdn地址前缀是 https://css.58.com/static/css, js 文件cdn地址前缀是https://js.58.com/static/js。其它文件地址是https://imgs.58.com/static/imgs。astro 就不支持了。此时对 astro 比较熟悉的同学会提出疑问:astro 支持vite配置扩展,vite 里不是有针对多cdn地址前缀的配置嘛?没错是的,但是,配置后你会发现几乎不起作用。
提了 issues 之后与核心开发者确认沟通,astro 确实无法支持多CDN配置。issues详情

尝试解决

不支持那么就开始尝试提PR来支持这个功能。
首先详细阅读astro贡献文档,astro建议新加功能在 roadmap 工程里提一个 Discussions。所以我新开了一个讨论,讨论详情

一些小技巧

提PR有些小技巧,要循序渐进的参与到开源项目中,何为循序渐进呢?先提issues与作者讨论,先混个“脸熟”,再提少量代码的PR,逐渐的代码量可以随着PR次数逐渐增多而增多。通过不断增多的沟通次数,逐渐提升你与作者之间的“亲密度”。这样的好处是能逐渐的了解整体架构和作者的设计思路,在做改动的时候不会破坏整体的设计,作者也更容易接受你的改动。不提倡突然大量代码的PR!

API设计 & 开发

在等了若干天发现讨论帖子没有什么动静。那就直接进入开发,提PR进行讨论。
开发第一步,先设计API,首先要兼容原有的API使用形式,而且灵活性要好,能适用各种场景。所以最终受vite配置启发,也采用函数的形式。
也使用 build.assetsPrefix 选项,当前 assetsPrefix 只支持字符串类型。添加函数类型,返回值为前缀字符串。

// assetsPrefix function

import { defineConfig } from 'astro/config';

export default defineConfig({
  build: {
    assetsPrefix: (fileType) => {
      if (fileType === 'js') {
        return 'https://js.example.com/'
      } else if (fileType === 'css') {
        return 'https://css.example.com/'
      }

      return ''
    }
  }
});

开始进入开发,将整个项目中用到 build.assetsPrefix 选项逻辑进行改造,添加function类型。改造完成后并未写自动测试代码,只是在项目中进行了一些手动测试,发现没问题。
提PR进行初次审核与讨论,没写测试就提PR主要考虑看看作者的想法,如果作者反对这种形式或者这种形式有什么问题,能减少我的开发量。PR1

通过PR1作者反馈在SSR场景下会不生效,建议使用对象的形式:

作者反馈

但我还是想用函数的形式,于是尝试修复SSR场景不生效问题。
经排查,SSR场景构建时候会对配置进行JSON.stringify导致方法丢失。

丢失原因

astro 构建项目的时候SSR场景会将配置部分内容进行打包到构建产物中,这种形式如果我们使用函数配置选项的话会对项目改动比较大,所以最终采纳作者建议使用对象的形式。最终使用方法如下最新文档。最终PR

现在文档

在写完功能的时候补充文档,astro支持多语言文档,除了写中文和英文语言没使用翻译软件,其他语言用的翻译软件翻译的。使用翻译软件部分被驳回了,这点非常不错。astro多语言文档整体流程是先写英文文档,各个语言部分有对应的开发者去根据英文翻译。


淡紫色的风鹏
22 声望5 粉丝

科技爱好者,专注无边界