React native 如何使react native packager忽略某些目录

React native 如何使react native packager忽略某些目录,react-native,React Native,问题: 我的项目在试图从命令行运行react native run ios时发生@providesModule命名冲突。它与由另一个npm包esdoc创建的自动生成的dirdist/冲突。我希望能够保留这个自动生成的目录,只需让react原生打包程序忽略dist/dir即可 错误消息: [01/23/2017, 13:17:07] <START> Building Haste Map Failed to build DependencyGraph: @providesModu

问题:

我的项目在试图从命令行运行
react native run ios
时发生
@providesModule命名冲突。它与由另一个npm包esdoc创建的自动生成的dir
dist/
冲突。我希望能够保留这个自动生成的目录,只需让react原生打包程序忽略
dist/
dir即可

错误消息:

[01/23/2017, 13:17:07] <START> Building Haste Map
    Failed to build DependencyGraph: @providesModule naming collision:
      Duplicate module name: ann
      Paths: /Users/thurt/projects/example/package.json collides with /Users/thurt/projects/example/dist/esdoc/package.json

This error is caused by a @providesModule declaration with the same name across two different files.
Error: @providesModule naming collision:
  Duplicate module name: ann
  Paths: /Users/thurt/projects/example/package.json collides with /Users/thurt/projects/example/dist/esdoc/package.json

This error is caused by a @providesModule declaration with the same name across two different files.
    at HasteMap._updateHasteMap (/Users/thurt/projects/example/node_modules/react-native/packager/react-packager/src/node-haste/DependencyGraph/HasteMap.js:158:13)
    at p.getName.then.name (/Users/thurt/projects/example/node_modules/react-native/packager/react-packager/src/node-haste/DependencyGraph/HasteMap.js:133:31)
[01/23/2017,13:17:07]建筑快速地图
未能生成DependencyGraph:@ProvideModule命名冲突:
重复模块名称:ann
路径:/Users/thurt/projects/example/package.json与/Users/thurt/projects/example/dist/esdoc/package.json冲突
此错误是由跨两个不同文件使用相同名称的@ProvideModule声明引起的。
错误:@providesModule命名冲突:
重复模块名称:ann
路径:/Users/thurt/projects/example/package.json与/Users/thurt/projects/example/dist/esdoc/package.json冲突
此错误是由跨两个不同文件使用相同名称的@ProvideModule声明引起的。
在HasteMap.\u updateHasteMap(/Users/thurt/projects/example/node\u modules/react native/packager/react packager/src/node-haste/DependencyGraph/HasteMap.js:158:13)
在p.getName.then.name(/Users/thurt/projects/example/node_modules/react native/packager/react packager/src/node haste/DependencyGraph/HasteMap.js:133:31)

此配置有在RN版本之间更改的习惯。有关创建配置文件、加载配置文件和清除缓存的特定于版本的说明,请参见下文

对于React Native>=0.64(?)

这是推测性的,因为0.64尚未发布,在0.64的RN中

在项目根目录中,创建包含以下内容的
metro.config.js

const exclusionList = require('metro-config/src/defaults/exclusionList');

// exclusionList is a function that takes an array of regexes and combines
// them with the default exclusions to return a single regex.

module.exports = {
  resolver: {
    blacklistRE: exclusionList([/dist\/.*/])
  }
};
const blacklist = require('metro-config/src/defaults/blacklist');

// blacklist is a function that takes an array of regexes and combines
// them with the default blacklist to return a single regex.

module.exports = {
  resolver: {
    blacklistRE: blacklist([/dist\/.*/])
  }
};
const blacklist = require('metro-config/src/defaults/blacklist');

// blacklist is a function that takes an array of regexes and combines
// them with the default blacklist to return a single regex.

module.exports = {
  resolver: {
    blacklistRE: blacklist([/dist\/.*/])
  }
};
const blacklist = require('metro').createBlacklist;

module.exports = {
  getBlacklistRE: function() {
    return blacklist([/dist\/.*/]);
  }
};
const blacklist = require('metro-bundler').createBlacklist;

module.exports = {
  getBlacklistRE: function() {
    return blacklist([/dist\/.*/]);
  }
};
const blacklist = require('react-native/packager/blacklist');

module.exports = {
  getBlacklistRE: function() {
    return blacklist([/dist\/.*/]);
  }
};
对于React Native>=0.59,<0.64

在项目根目录中,创建包含以下内容的
metro.config.js

const exclusionList = require('metro-config/src/defaults/exclusionList');

// exclusionList is a function that takes an array of regexes and combines
// them with the default exclusions to return a single regex.

module.exports = {
  resolver: {
    blacklistRE: exclusionList([/dist\/.*/])
  }
};
const blacklist = require('metro-config/src/defaults/blacklist');

// blacklist is a function that takes an array of regexes and combines
// them with the default blacklist to return a single regex.

module.exports = {
  resolver: {
    blacklistRE: blacklist([/dist\/.*/])
  }
};
const blacklist = require('metro-config/src/defaults/blacklist');

// blacklist is a function that takes an array of regexes and combines
// them with the default blacklist to return a single regex.

module.exports = {
  resolver: {
    blacklistRE: blacklist([/dist\/.*/])
  }
};
const blacklist = require('metro').createBlacklist;

module.exports = {
  getBlacklistRE: function() {
    return blacklist([/dist\/.*/]);
  }
};
const blacklist = require('metro-bundler').createBlacklist;

module.exports = {
  getBlacklistRE: function() {
    return blacklist([/dist\/.*/]);
  }
};
const blacklist = require('react-native/packager/blacklist');

module.exports = {
  getBlacklistRE: function() {
    return blacklist([/dist\/.*/]);
  }
};
对于React Native>=0.57,<0.59

在项目根目录中创建
rn cli.config.js
,内容如下:

const exclusionList = require('metro-config/src/defaults/exclusionList');

// exclusionList is a function that takes an array of regexes and combines
// them with the default exclusions to return a single regex.

module.exports = {
  resolver: {
    blacklistRE: exclusionList([/dist\/.*/])
  }
};
const blacklist = require('metro-config/src/defaults/blacklist');

// blacklist is a function that takes an array of regexes and combines
// them with the default blacklist to return a single regex.

module.exports = {
  resolver: {
    blacklistRE: blacklist([/dist\/.*/])
  }
};
const blacklist = require('metro-config/src/defaults/blacklist');

// blacklist is a function that takes an array of regexes and combines
// them with the default blacklist to return a single regex.

module.exports = {
  resolver: {
    blacklistRE: blacklist([/dist\/.*/])
  }
};
const blacklist = require('metro').createBlacklist;

module.exports = {
  getBlacklistRE: function() {
    return blacklist([/dist\/.*/]);
  }
};
const blacklist = require('metro-bundler').createBlacklist;

module.exports = {
  getBlacklistRE: function() {
    return blacklist([/dist\/.*/]);
  }
};
const blacklist = require('react-native/packager/blacklist');

module.exports = {
  getBlacklistRE: function() {
    return blacklist([/dist\/.*/]);
  }
};
对于React Native>=0.52,<0.57

在项目根目录中创建
rn cli.config.js
,内容如下:

const exclusionList = require('metro-config/src/defaults/exclusionList');

// exclusionList is a function that takes an array of regexes and combines
// them with the default exclusions to return a single regex.

module.exports = {
  resolver: {
    blacklistRE: exclusionList([/dist\/.*/])
  }
};
const blacklist = require('metro-config/src/defaults/blacklist');

// blacklist is a function that takes an array of regexes and combines
// them with the default blacklist to return a single regex.

module.exports = {
  resolver: {
    blacklistRE: blacklist([/dist\/.*/])
  }
};
const blacklist = require('metro-config/src/defaults/blacklist');

// blacklist is a function that takes an array of regexes and combines
// them with the default blacklist to return a single regex.

module.exports = {
  resolver: {
    blacklistRE: blacklist([/dist\/.*/])
  }
};
const blacklist = require('metro').createBlacklist;

module.exports = {
  getBlacklistRE: function() {
    return blacklist([/dist\/.*/]);
  }
};
const blacklist = require('metro-bundler').createBlacklist;

module.exports = {
  getBlacklistRE: function() {
    return blacklist([/dist\/.*/]);
  }
};
const blacklist = require('react-native/packager/blacklist');

module.exports = {
  getBlacklistRE: function() {
    return blacklist([/dist\/.*/]);
  }
};
对于React Native>=0.46,<0.52

在项目根目录中创建
rn cli.config.js
,内容如下:

const exclusionList = require('metro-config/src/defaults/exclusionList');

// exclusionList is a function that takes an array of regexes and combines
// them with the default exclusions to return a single regex.

module.exports = {
  resolver: {
    blacklistRE: exclusionList([/dist\/.*/])
  }
};
const blacklist = require('metro-config/src/defaults/blacklist');

// blacklist is a function that takes an array of regexes and combines
// them with the default blacklist to return a single regex.

module.exports = {
  resolver: {
    blacklistRE: blacklist([/dist\/.*/])
  }
};
const blacklist = require('metro-config/src/defaults/blacklist');

// blacklist is a function that takes an array of regexes and combines
// them with the default blacklist to return a single regex.

module.exports = {
  resolver: {
    blacklistRE: blacklist([/dist\/.*/])
  }
};
const blacklist = require('metro').createBlacklist;

module.exports = {
  getBlacklistRE: function() {
    return blacklist([/dist\/.*/]);
  }
};
const blacklist = require('metro-bundler').createBlacklist;

module.exports = {
  getBlacklistRE: function() {
    return blacklist([/dist\/.*/]);
  }
};
const blacklist = require('react-native/packager/blacklist');

module.exports = {
  getBlacklistRE: function() {
    return blacklist([/dist\/.*/]);
  }
};
用于反应本机<0.46

在项目根目录中创建
rn cli.config.js
,内容如下:

const exclusionList = require('metro-config/src/defaults/exclusionList');

// exclusionList is a function that takes an array of regexes and combines
// them with the default exclusions to return a single regex.

module.exports = {
  resolver: {
    blacklistRE: exclusionList([/dist\/.*/])
  }
};
const blacklist = require('metro-config/src/defaults/blacklist');

// blacklist is a function that takes an array of regexes and combines
// them with the default blacklist to return a single regex.

module.exports = {
  resolver: {
    blacklistRE: blacklist([/dist\/.*/])
  }
};
const blacklist = require('metro-config/src/defaults/blacklist');

// blacklist is a function that takes an array of regexes and combines
// them with the default blacklist to return a single regex.

module.exports = {
  resolver: {
    blacklistRE: blacklist([/dist\/.*/])
  }
};
const blacklist = require('metro').createBlacklist;

module.exports = {
  getBlacklistRE: function() {
    return blacklist([/dist\/.*/]);
  }
};
const blacklist = require('metro-bundler').createBlacklist;

module.exports = {
  getBlacklistRE: function() {
    return blacklist([/dist\/.*/]);
  }
};
const blacklist = require('react-native/packager/blacklist');

module.exports = {
  getBlacklistRE: function() {
    return blacklist([/dist\/.*/]);
  }
};
所有版本<0.59

通过传递
--config
选项,让CLI命令使用此配置:

react native run ios--config=rn cli.config.js

(配置文件应该由RN>=0.59自动拾取,因为它被重命名为
metro.config.js

所有版本:关于缓存的注意事项


请注意,您的黑名单项目可能已经被打包机包含在缓存中,在这种情况下,第一次使用黑名单运行打包机时,您可能需要使用
--reset cache

重置缓存,谢谢rob!对于我的情况,我所需要做的就是包含
--reset cache
标志。现在看来我的
rn cli.config.js
文件是自动使用的,所以我不需要
--config=rn cli.config.js
。在成功通过packager步骤后,当应用程序首次尝试加载时,我仍然收到“未找到模块”错误。我将项目文件夹名称添加到黑名单正则表达式的开头,这似乎解决了这个问题。我想我需要确保打包程序不会忽略/node_modules//dist/之类的文件夹,这里没有说的是匹配被锚定到输入的末尾(数组中的正则表达式被构建到一个以$结尾的最终正则表达式中)。。。因此,请确保在要匹配的正则表达式末尾添加一个。*。另外,另一个有用的提示是,所有“/”正斜杠都会自动替换为当前操作系统路径分隔符
@EhteshChoudhury-谢谢,但是
inlineRequires
不是这个答案所涵盖的选项。但是,在metro 0.60中,
defaults
中导出的函数实际上已从
blacklist
重命名为
exclusionList
。我已经添加了一个关于RN 0.64+的部分,介绍了这一点。感谢您添加0.64更新。我已经测试过了,可以正常工作。您好,我刚刚在我的文章中看到了这篇文章,我使用的是0.59.8 react native版本,我有两个metro.config.js文件,一个在node module/metro下,另一个在node module/react native下,要更改哪一个?plz帮助在过去3天内解决问题