mirror of
https://github.com/status-im/react-native.git
synced 2025-01-17 04:50:59 +00:00
9d09efdd53
Summary:Make packager transform files before extracting their dependencies. This allows us to extract dependencies added by transforms (and to avoid including them manually). It also allows for better optimization and to get rid of the “whole program optimization” step: This diff utilizes the new worker introduced in D2976677 / d94a567 – that means that minified builds inline the following variables: - `__DEV__` → `false` - `process.env.NODE_ENV` → `'production'` - `Platform.OS` / `React.Platform.OS` → `'android'` / `'ios'` and eliminates branches of conditionals with constant conditions. Dependency extraction happens only after that step, which means that production bundles don’t include any modules that are not used. Fixes #4185 Reviewed By: martinbigio Differential Revision: D2977169 fb-gh-sync-id: e6ce8dd29d1b49aec49b309201141f5b2709da1d shipit-source-id: e6ce8dd29d1b49aec49b309201141f5b2709da1d
117 lines
3.6 KiB
JavaScript
117 lines
3.6 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 fs = require('fs');
|
|
const log = require('../util/log').out('dependencies');
|
|
const parseCommandLine = require('../util/parseCommandLine');
|
|
const path = require('path');
|
|
const Promise = require('promise');
|
|
const ReactPackager = require('../../packager/react-packager');
|
|
|
|
/**
|
|
* Returns the dependencies an entry path has.
|
|
*/
|
|
function dependencies(argv, config) {
|
|
return new Promise((resolve, reject) => {
|
|
_dependencies(argv, config, resolve, reject);
|
|
});
|
|
}
|
|
|
|
function _dependencies(argv, config, resolve, reject) {
|
|
const args = parseCommandLine([
|
|
{
|
|
command: 'entry-file',
|
|
description: 'Absolute path to the root JS file',
|
|
type: 'string',
|
|
required: true,
|
|
}, {
|
|
command: 'output',
|
|
description: 'File name where to store the output, ex. /tmp/dependencies.txt',
|
|
type: 'string',
|
|
}, {
|
|
command: 'platform',
|
|
description: 'The platform extension used for selecting modules',
|
|
type: 'string',
|
|
}, {
|
|
command: 'transformer',
|
|
type: 'string',
|
|
default: require.resolve('../../packager/transformer'),
|
|
description: 'Specify a custom transformer to be used (absolute path)'
|
|
}, {
|
|
command: 'verbose',
|
|
description: 'Enables logging',
|
|
default: false,
|
|
}
|
|
], argv);
|
|
|
|
const rootModuleAbsolutePath = args['entry-file'];
|
|
if (!fs.existsSync(rootModuleAbsolutePath)) {
|
|
reject(`File ${rootModuleAbsolutePath} does not exist`);
|
|
}
|
|
|
|
const packageOpts = {
|
|
projectRoots: config.getProjectRoots(),
|
|
assetRoots: config.getAssetRoots(),
|
|
blacklistRE: config.getBlacklistRE(args.platform),
|
|
getTransformOptionsModulePath: config.getTransformOptionsModulePath,
|
|
transformModulePath: args.transformer,
|
|
verbose: config.verbose,
|
|
};
|
|
|
|
const relativePath = packageOpts.projectRoots.map(root =>
|
|
path.relative(
|
|
root,
|
|
rootModuleAbsolutePath
|
|
)
|
|
)[0];
|
|
|
|
const options = {
|
|
platform: args.platform,
|
|
entryFile: relativePath,
|
|
};
|
|
|
|
const writeToFile = args.output;
|
|
const outStream = writeToFile
|
|
? fs.createWriteStream(args.output)
|
|
: process.stdout;
|
|
|
|
// TODO: allow to configure which logging namespaces should get logged
|
|
// log('Running ReactPackager');
|
|
// log('Waiting for the packager.');
|
|
resolve(ReactPackager.createClientFor(packageOpts).then(client => {
|
|
// log('Packager client was created');
|
|
return client.getOrderedDependencyPaths(options)
|
|
.then(deps => {
|
|
// log('Packager returned dependencies');
|
|
client.close();
|
|
|
|
deps.forEach(modulePath => {
|
|
// Temporary hack to disable listing dependencies not under this directory.
|
|
// Long term, we need either
|
|
// (a) JS code to not depend on anything outside this directory, or
|
|
// (b) Come up with a way to declare this dependency in Buck.
|
|
const isInsideProjectRoots = packageOpts.projectRoots.filter(
|
|
root => modulePath.startsWith(root)
|
|
).length > 0;
|
|
|
|
if (isInsideProjectRoots) {
|
|
outStream.write(modulePath + '\n');
|
|
}
|
|
});
|
|
return writeToFile
|
|
? Promise.denodeify(outStream.end).bind(outStream)()
|
|
: Promise.resolve();
|
|
// log('Wrote dependencies to output file');
|
|
});
|
|
}));
|
|
}
|
|
|
|
module.exports = dependencies;
|