React-Native 地铁捆绑器无法提供任何文件

React-Native metro bundler can't serve any file

Metro 捆绑器可以解析依赖关系图(应用程序在模拟器中启动)但无法解析任何资产,因此应用程序中的所有图像都丢失了。

这个问题是我从react-native@0.57升级到0.59后出现的

Looking for JS files in
   /Users/name/app/MyApp/artifacts
   /Users/name/app/MyApp/node_modules

warning: the transform cache was reset.
Loading dependency graph, done.
 DELTA  [android, dev] artifacts/index.js ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ 100.0% (2921/2921), done.

 MAP  [android, dev] artifacts/index.js ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ 100.0% (1/1), done.


::ffff:127.0.0.1 - - [30/Aug/2019:06:27:17 +0000] "GET /node_modules/my-assets/artifacts/assets/images/Logo.png?platform=android&hash=someHash HTTP/1.1" 404 221 "-" "okhttp/3.12.1"

^^^ 问题出现在导航到包含 <Image source=... />

的任何视图时

模块 my-assets 确实存在并且包含所有需要的资产

开始:node node_modules/react-native/local-cli/cli.js start --reset-cache --projectRoot artifacts

artifacts 包含来自 .ts

的转译 .js 代码

我的文件结构是这样的

.
├── artifacts # transpiled js files
├── node_modules #npm modules
└── src # ts files

捆绑器服务器输出

metro.config.js

module.exports = {
    watchFolders: [path.join(__dirname, 'node_modules')],
    transformer: {
        getTransformOptions: async () => ({
            transform: {
                experimentalImportSupport: false,
                inlineRequires: false
            }
        })
    },
    resolver: {
        blacklistRE: blacklist([       /node_modules\/.*\/node_modules\/react-native\/.*/]),
        assetRegistryPath: path.resolve('node_modules/react-native/Libraries/Image/AssetRegistry')
    }
}

依赖项:

my-app@1.0 /Users/name/app/MyApp
├── metro@0.48.5  extraneous
└─┬ react-native@0.59.4
  └─┬ @react-native-community/cli@1.11.2
    ├── metro@0.51.1
    └─┬ metro-config@0.51.1
      └── metro@0.51.1  deduped

我也尝试在浏览器中转到 url,但也为以下两个请求转到 404

http://localhost:8081/node_modules/my-assets/artifacts/assets/images/Logo.png?platform=android&hash=someHash

http://localhost:8081/node_modules/metro/src/Bundler/util.js # request to any js file also return 404

-- 更新--

清理缓存和删除 $TMPDIR 没有帮助

尝试清理缓存并重试

rm -rf $TMPDIR/react-native-packager-cache-*
rm -rf $TMPDIR/metro-bundler-cache-* 
rm -rf $TMPDIR/haste-*;
yarn cache clean

请尝试此命令

npm cache clean

我看到通知然后意识到我之前问过这个

我不记得我是怎么想出来的,但在我的提交消息中有这个 issue come into my sight, and they mentioned at comment:

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


为了解决这个问题,我不得不更改我的文件结构

.
├── artifacts
├── node_modules
├── package.json
├── src
│   ├── index.ts

收件人:

.
├── artifacts
├── index.js # added this root level entry file
├── node_modules
├── src
│   ├── index.ts

新添加的 index.js 中的只是 require('./artifacts/index.js') 作为 metro 的入口文件。并使用 npx react-native start --skipflow --reset-cache. 启动服务器,以确保所有内容都在根目录中。

(如 OP 中所述,我们使用 node node_modules/react-native/local-cli/cli.js start --reset-cache --projectRoot artifacts 启动 metro 服务器,因此您可以更改 --projectRoot 以指向正确的目录以将其存档)