-
Notifications
You must be signed in to change notification settings - Fork 634
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
After upgrade, the assets in other watchedFolders are not resolved correctly #322
Comments
Thanks for reporting! I'm gonna try to reproduce, from what I understand in your example the |
Ok, I've been able to reproduce it, the issue was introduced in a711d73 😅 Thanks for the detailed explanation of the issue, it was very helpful to debug it 😃 Very soon we want to force all watch folders to be inside the project root of metro, this way Metro can safely use the project root as the root of the http server that provides the assets and this will fix this issue. In order to make this change, we'll change the meaning of the I'm gonna check now if there's any short-term workaround to fix this issue in the meantime |
Whaa so quick.
You are welcome ! Was a pleasure :) Quite a funny bug to investigate !
Do you mean that with my folder structure, in the future the project root will be the parent, i.e., in my example "affiny" ?
Thank you man ! I was thinking of patch-packaging react-native with a function resolveAssetSource(source: any): ?ResolvedAssetSource {
if (typeof source === 'object') {
return source;
}
const asset = AssetRegistry.getAssetByID(source);
+ asset.httpServerLocation = asset.httpServerLocation.replace("affiny-core", "assets");
if (!asset) {
return null;
}
const resolver = new AssetSourceResolver(
getDevServerURL(),
getScriptURL(),
asset,
);
if (_customSourceTransformer) {
return _customSourceTransformer(resolver);
}
return resolver.defaultAsset();
} or something uggy like this. Happy to have something less ugly ;) |
Exactly! yeah in order to do that change we have to figure out what changes are going to be needed in the RN config side. I'm preparing a fix for the issue, it's not going to be the most beautiful thing but will do the trick for now |
😍 |
Well done sir. |
For record, I tried hard to apply the fix in my project:
I finally did this hack stuff: diff --git a/node_modules/react-native/Libraries/Image/resolveAssetSource.js b/node_modules/react-native/Libraries/Image/resolveAssetSource.js
index 9c811e5..931953d 100644
--- a/node_modules/react-native/Libraries/Image/resolveAssetSource.js
+++ b/node_modules/react-native/Libraries/Image/resolveAssetSource.js
@@ -95,6 +95,11 @@ function resolveAssetSource(source: any): ?ResolvedAssetSource {
return null;
}
+ if (!asset.httpServerLocation.startsWith('/assets')) {
+ const parsedUrl = /\/[\w\-]+(\/.*)/.exec(asset.httpServerLocation);
+ asset.httpServerLocation = parsedUrl[1];
+ }
+
const resolver = new AssetSourceResolver(
getDevServerURL(),
getScriptURL(), using patch package. We aim to remove this in one two month, when migrating to RN 0.58 ! |
Edit the above "hack does work in dev but not when assets are bundled. I will move my assets from the centralised directory to the main directory for now, even if that means duplication. |
Just wanted to chime in here and say I am also having this issue, and trying to apply the fix was unsuccessful |
In my case, to the watchFolder resides out of projectRoot. The RN Android image system uses okhttp to send requests. My folder structure is pretty much like @tychota. Well, there is a dirty workaround for me. |
# Summary After changing project structure, local images stopped displaying on Android. This is due to the fact that React Native on Android uses okhttp for requests, which modifies the endpoint "by cleaning up the wrong part" from `http://10.0.2.2:8081/../common/example/assets/image.jpg` to `http://10.0.2.2:8081/common/example/assets/image.jpg` A quick fix for this is to create a symlink to the common directory, allowing images to be resolved without the `../` segment. Special thanks to Kudo for sharing the original workaround here: facebook/metro#322 (comment).
Do you want to request a feature or report a bug?
A bug
What is the current behavior?
Images located in other
watchedFolders
are not resolved properly in react native after upgrade.Upgrade details:
The structure of my files looks like this:
and I have a rn-cli:
Before upgrade, i can do:
and
After upgrade, i can do:
but image in my-project-core, eg:
are resulting in a gray screen:
What is the expected behavior?
Either:
Investigation
I added a breakpoint here:
Before the upgrade, the packager url for assets was:
after the upgrade:
Note above:
When asking for
http://localhost:8081/affiny-core/assets/img/profile_capture/search.jpg?platform=ios&hash=51dac229328bf5d045e9401cb6cb3cb4
, I get a 404.Note that
http://localhost:8081/assets/assets/img/profile_capture/search.jpg?platform=ios&hash=51dac229328bf5d045e9401cb6cb3cb4
works on both old RN/metro and new RN/metro.Idea
Seems like ea980fd#diff-71293ea379a7cf006cd4648701a7c568 (#299) is the root cause.
Maybe the RN packager is not aware of the public path.
Reproduction steps
I think it is a bit involving to do a repro here. Maybe you will have an idea with above investigation, else I will spend time doing a repro.
Configuration
Node: v8.11.3
React Native: 0.57.7
Metro: 0.49.2
The text was updated successfully, but these errors were encountered: