Skip to content

Commit

Permalink
Eliminate dead dependencies from bundle
Browse files Browse the repository at this point in the history
  • Loading branch information
garthenweb committed Feb 17, 2019
1 parent 31bd420 commit fe54a09
Show file tree
Hide file tree
Showing 9 changed files with 141 additions and 2 deletions.
@@ -0,0 +1 @@
module.exports = () => 'browser';
@@ -0,0 +1,5 @@
const browserDep = require('./browser-dep.js');

const res = browserDep();

module.exports = res;
@@ -0,0 +1,6 @@
module.exports = (() => {
if (process.browser) {
return require('./browser');
}
return require('./server');
})()
@@ -0,0 +1 @@
module.exports = () => 'server';
@@ -0,0 +1,5 @@
const serverDep = require('./server-dep.js');

const res = serverDep();

module.exports = res;
66 changes: 66 additions & 0 deletions packages/core/integration-tests/test/javascript.js
Expand Up @@ -895,6 +895,72 @@ describe('javascript', function() {
assert.equal(output(), false);
});

it('should eliminate dead dependencies on --target=browser when minified', async function() {
let b = await bundle(
path.join(__dirname, '/integration/process/index-dead.js'),
{
minify: true,
target: 'browser'
}
);

await assertBundleTree(b, {
name: 'index-dead.js',
assets: ['index-dead.js', 'browser.js', 'browser-dep.js']
});

let output = await run(b);
assert.equal(output, 'browser');
});

it('should not eliminate dead dependencies on --target=node', async function() {
let b = await bundle(
path.join(__dirname, '/integration/process/index-dead.js'),
{
minify: true,
target: 'node'
}
);

await assertBundleTree(b, {
name: 'index-dead.js',
assets: [
'index-dead.js',
'browser.js',
'browser-dep.js',
'server.js',
'server-dep.js'
]
});

let output = await run(b);
assert.equal(output, 'server');
});

it('should not eliminate dead dependencies on --target=electron', async function() {
let b = await bundle(
path.join(__dirname, '/integration/process/index-dead.js'),
{
minify: true,
target: 'node'
}
);

await assertBundleTree(b, {
name: 'index-dead.js',
assets: [
'index-dead.js',
'browser.js',
'browser-dep.js',
'server.js',
'server-dep.js'
]
});

let output = await run(b);
assert.equal(output, 'server');
});

it('should support adding implicit dependencies', async function() {
let b = await bundle(path.join(__dirname, '/integration/json/index.js'), {
delegate: {
Expand Down
1 change: 1 addition & 0 deletions packages/core/parcel-bundler/package.json
Expand Up @@ -34,6 +34,7 @@
"@parcel/watcher": "^1.11.0",
"@parcel/workers": "^1.11.0",
"ansi-to-html": "^0.6.4",
"babel-plugin-minify-dead-code-elimination": "^0.5.0",
"babylon-walk": "^1.0.2",
"browserslist": "^4.1.0",
"chalk": "^2.1.0",
Expand Down
28 changes: 26 additions & 2 deletions packages/core/parcel-bundler/src/assets/JSAsset.js
Expand Up @@ -153,17 +153,41 @@ class JSAsset extends Asset {
await babel(this);

// Inline environment variables
if (this.options.target === 'browser' && ENV_RE.test(this.contents)) {
const hasProcessEnv = ENV_RE.test(this.contents);
if (this.options.target === 'browser' && hasProcessEnv) {
await this.parseIfNeeded();
this.traverseFast(envVisitor);
}

// Inline process.browser
if (this.options.target === 'browser' && BROWSER_RE.test(this.contents)) {
const hasProcessBrowser = BROWSER_RE.test(this.contents);
if (this.options.target === 'browser' && hasProcessBrowser) {
await this.parseIfNeeded();
this.traverse(processVisitor);
this.isAstDirty = true;
}

if (
this.options.minify &&
this.options.target === 'browser' &&
(hasProcessBrowser || hasProcessEnv)
) {
await babel7(this, {
internal: true,
config: {
plugins: [
[
require('babel-plugin-minify-dead-code-elimination'),
{
keepFnName: true,
keepFnArgs: true,
keepClassName: true
}
]
]
}
});
}
}

async transform() {
Expand Down
30 changes: 30 additions & 0 deletions yarn.lock
Expand Up @@ -1850,6 +1850,11 @@ babel-helper-define-map@^6.24.1:
babel-types "^6.26.0"
lodash "^4.17.4"

babel-helper-evaluate-path@^0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.5.0.tgz#a62fa9c4e64ff7ea5cea9353174ef023a900a67c"
integrity sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA==

babel-helper-explode-assignable-expression@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
Expand Down Expand Up @@ -1886,6 +1891,11 @@ babel-helper-hoist-variables@^6.24.1:
babel-runtime "^6.22.0"
babel-types "^6.24.1"

babel-helper-mark-eval-scopes@^0.4.3:
version "0.4.3"
resolved "https://registry.yarnpkg.com/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.4.3.tgz#d244a3bef9844872603ffb46e22ce8acdf551562"
integrity sha1-0kSjvvmESHJgP/tG4izorN9VFWI=

babel-helper-optimise-call-expression@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
Expand Down Expand Up @@ -1914,6 +1924,11 @@ babel-helper-remap-async-to-generator@^6.24.1:
babel-traverse "^6.24.1"
babel-types "^6.24.1"

babel-helper-remove-or-void@^0.4.3:
version "0.4.3"
resolved "https://registry.yarnpkg.com/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.4.3.tgz#a4f03b40077a0ffe88e45d07010dee241ff5ae60"
integrity sha1-pPA7QAd6D/6I5F0HAQ3uJB/1rmA=

babel-helper-replace-supers@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
Expand Down Expand Up @@ -1948,6 +1963,16 @@ babel-plugin-check-es2015-constants@^6.22.0:
dependencies:
babel-runtime "^6.22.0"

babel-plugin-minify-dead-code-elimination@^0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.5.0.tgz#d23ef5445238ad06e8addf5c1cf6aec835bcda87"
integrity sha512-XQteBGXlgEoAKc/BhO6oafUdT4LBa7ARi55mxoyhLHNuA+RlzRmeMAfc31pb/UqU01wBzRc36YqHQzopnkd/6Q==
dependencies:
babel-helper-evaluate-path "^0.5.0"
babel-helper-mark-eval-scopes "^0.4.3"
babel-helper-remove-or-void "^0.4.3"
lodash.some "^4.6.0"

babel-plugin-syntax-async-functions@^6.8.0:
version "6.13.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
Expand Down Expand Up @@ -6525,6 +6550,11 @@ lodash.noop@~2.3.0:
resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-2.3.0.tgz#3059d628d51bbf937cd2a0b6fc3a7f212a669c2c"
integrity sha1-MFnWKNUbv5N80qC2/Dp/ISpmnCw=

lodash.some@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=

lodash.sortby@^4.7.0:
version "4.7.0"
resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
Expand Down

0 comments on commit fe54a09

Please sign in to comment.