umijs / umi

A framework in react community ✨
https://umijs.org
MIT License
15.38k stars 2.65k forks source link

[Bug] window.publicPath 为非标准链接时,替换会出现bug #10971

Closed junglehuang closed 1 year ago

junglehuang commented 1 year ago

What happens?

1、将设置成一个非http变量 window.publicPath window.publicPath = '__VAN_STATIC_BASE_PATH__/'; 2、开启配置 runtimePublicPath: {},

3、编译后出下以下结果 `<!DOCTYPE html>

` 以上问题出现子啊。 正确应该将 framework.js 替换到src上。 ## Mini Showcase Repository(REQUIRED) > Please provide a [minimal reproduction](https://stackoverflow.com/help/minimal-reproducible-example) then upload to your GitHub. 请提供 [最小重现](https://stackoverflow.com/help/minimal-reproducible-example),并上传到你的 GitHub 仓库 ## How To Reproduce **Steps to reproduce the behavior:** 1. 2. **Expected behavior** 1. 2. ## Context - **Umi Version**: - **Node Version**: - **Platform**:
github-actions[bot] commented 1 year ago

由于缺乏足够的信息,我们暂时关闭了该 Issue。请修改(不要回复) Issue 提供最小重现以重新开启。谢谢。

fz6m commented 1 year ago

给一个最小复现看看

lizijie1993 commented 5 months ago

+1遇到问题。配置publicPath为一个占位符:__ASSETS_CDN__/,build的结果framework.js不在script标签的src,其他的资源文件没问题 image image

如果是默认的 / 或者一个正确域名,build结果是正确的 image image

版本:@umijs/max,4.2.5

fz6m commented 5 months ago

publicPath 必须是一个有效的 url 路径,你如果需要在后续 replace 替换,需要配置成正常的 url ,只不过这个 url 你可以设计成占位格式,比如 publicPath: process.env.NODE_ENV === 'development' ? '/' : 'https://__cdn_domain__/'

另外你还需要开启 runtimePublicPath: {} ,并插入 head script ,确保异步块加载时 public path 没问题:

// .umirc.ts

  runtimePublicPath: process.env.NODE_ENV === 'development' ? false : {},
  headScripts: process.env.NODE_ENV === 'development' ? [] : [
    `window.publicPath = 'https://__cdn_domain__/';`,
  ]

构建后,在部署前,将占位符替换为需要的值即可。

lizijie1993 commented 5 months ago

publicPath 必须是一个有效的 url 路径,你如果需要在后续 replace 替换,需要配置成正常的 url ,只不过这个 url 你可以设计成占位格式,比如 publicPath: process.env.NODE_ENV === 'development' ? '/' : 'https://__cdn_domain__/'

另外你还需要开启 runtimePublicPath: {} ,并插入 head script ,确保异步块加载时 public path 没问题:

// .umirc.ts

  runtimePublicPath: process.env.NODE_ENV === 'development' ? false : {},
  headScripts: process.env.NODE_ENV === 'development' ? [] : [
    `window.publicPath = 'https://__cdn_domain__/';`,
  ]

构建后,在部署前,将占位符替换为需要的值即可。

占位符我们从umi3开始就是这么在用了,替换逻辑是我们发布平台控制,不在业务项目中。我们有几个别的项目也是 @umijs/max 4.2.5版本,但不会打包出framework.js,所以也不会有问题。我看了配置umi的配置都是相同的,什么情况下会打出framework.js文件呢

fz6m commented 5 months ago

开了 codeSplitting 分包策略就会有 framework.js ,因为 umi 4 默认按页分包,所以一定会存在异步加载的 js ,这些 js 的路径如果不提前在 umi 配置文件里配好静态的 publicPath 的话,就必须开启 runtimePublicPath 配置 window.publicPath ,不然会加载不到,要同时考虑这两个情况。

或者你就把 replace mark 搞的特殊唯一,然后对产物所有 js 和 html 文件里的这个 mark 都替换一下。