mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-02-12 09:20:14 +08:00
Summary:
There's quite a bit of code scattered around the packager regarding ignoring the `providesModule` Haste pragma in any file that isn't in `react-native`, `react-tools` or `parse`. There is even a (passing) test case.
However, there's an edge case.
Take, for example, `fbjs`. It has a module inside of it called `ErrorUtils`. `react-relay` requires this file normally, in Common.JS style, by doing `require('fbjs/libs/ErrorUtils')`. But when `react-native` attempts to require `ErrorUtils` using the HasteModule format (in it's JavaScript initialization), it resolves the `fbjs` `ErrorUtils` module, instead of RN's `ErrorUtils`.
This happens, it turns out, because when a module is read (in `Module._read`), it's not caring about whether or not it should pay attention to `providesModule`, and is just assigning the `providesModule` value as the id of the module no matter what. Then when `Module.getName` is called, it will always use that `data.id` that was set, thus creating the wrong dependency tree.
This
Closes https://github.com/facebook/react-native/pull/3625
Reviewed By: svcscm
Differential Revision: D2632317
Pulled By: vjeux
fb-gh-sync-id: efd8066eaf6f18fcf79698beab36cab90bf5cd6d
116 lines
2.8 KiB
JavaScript
116 lines
2.8 KiB
JavaScript
/**
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
'use strict';
|
|
|
|
const AssetModule_DEPRECATED = require('../AssetModule_DEPRECATED');
|
|
const Fastfs = require('../fastfs');
|
|
const debug = require('debug')('ReactNativePackager:DependencyGraph');
|
|
const path = require('path');
|
|
const Promise = require('promise');
|
|
|
|
class DeprecatedAssetMap {
|
|
constructor({
|
|
fsCrawl,
|
|
roots,
|
|
assetExts,
|
|
fileWatcher,
|
|
ignoreFilePath,
|
|
helpers,
|
|
activity,
|
|
}) {
|
|
if (roots == null || roots.length === 0) {
|
|
this._disabled = true;
|
|
return;
|
|
}
|
|
|
|
this._helpers = helpers;
|
|
this._map = Object.create(null);
|
|
this._assetExts = assetExts;
|
|
this._fastfs = new Fastfs(
|
|
'Assets',
|
|
roots,
|
|
fileWatcher,
|
|
{ ignore: ignoreFilePath, crawling: fsCrawl, activity }
|
|
);
|
|
this._activity = activity;
|
|
|
|
this._fastfs.on('change', this._processFileChange.bind(this));
|
|
}
|
|
|
|
build() {
|
|
if (this._disabled) {
|
|
return Promise.resolve();
|
|
}
|
|
|
|
return this._fastfs.build().then(
|
|
() => {
|
|
const activity = this._activity;
|
|
let processAsset_DEPRECATEDActivity;
|
|
if (activity) {
|
|
processAsset_DEPRECATEDActivity = activity.startEvent(
|
|
'Building (deprecated) Asset Map',
|
|
);
|
|
}
|
|
|
|
this._fastfs.findFilesByExts(this._assetExts).forEach(
|
|
file => this._processAsset(file)
|
|
);
|
|
|
|
if (activity) {
|
|
activity.endEvent(processAsset_DEPRECATEDActivity);
|
|
}
|
|
}
|
|
);
|
|
}
|
|
|
|
resolve(fromModule, toModuleName) {
|
|
if (this._disabled) {
|
|
return null;
|
|
}
|
|
|
|
const assetMatch = toModuleName.match(/^image!(.+)/);
|
|
if (assetMatch && assetMatch[1]) {
|
|
if (!this._map[assetMatch[1]]) {
|
|
debug('WARINING: Cannot find asset:', assetMatch[1]);
|
|
return null;
|
|
}
|
|
return this._map[assetMatch[1]];
|
|
}
|
|
}
|
|
|
|
_processAsset(file) {
|
|
const ext = this._helpers.extname(file);
|
|
if (this._assetExts.indexOf(ext) !== -1) {
|
|
const name = assetName(file, ext);
|
|
if (this._map[name] != null) {
|
|
debug('Conflcting assets', name);
|
|
}
|
|
|
|
this._map[name] = new AssetModule_DEPRECATED({ file });
|
|
}
|
|
}
|
|
|
|
_processFileChange(type, filePath, root, fstat) {
|
|
const name = assetName(filePath);
|
|
if (type === 'change' || type === 'delete') {
|
|
delete this._map[name];
|
|
}
|
|
|
|
if (type === 'change' || type === 'add') {
|
|
this._processAsset(path.join(root, filePath));
|
|
}
|
|
}
|
|
}
|
|
|
|
function assetName(file, ext) {
|
|
return path.basename(file, '.' + ext).replace(/@[\d\.]+x/, '');
|
|
}
|
|
|
|
module.exports = DeprecatedAssetMap;
|