diff --git a/README.md b/README.md index 32323d1d134..e850364615f 100644 --- a/README.md +++ b/README.md @@ -14,12 +14,12 @@ ## Features -- 🚀 **Blazing fast** bundle times - multicore compilation, and a filesystem cache for fast rebuilds even after a restart. -- 📦 Out of the box support for JS, CSS, HTML, file assets, and more - **no plugins to install**. -- 🐠 **Automatically transforms modules** using Babel, PostCSS, and PostHTML when needed - even `node_modules`. -- ✂️ Zero configuration **code splitting** using dynamic `import()` statements. -- 🔥 Built in support for **hot module replacement** -- 🚨 Friendly error logging experience - syntax highlighted code frames help pinpoint the problem. +* 🚀 **Blazing fast** bundle times - multicore compilation, and a filesystem cache for fast rebuilds even after a restart. +* 📦 Out of the box support for JS, CSS, HTML, file assets, and more - **no plugins to install**. +* 🐠 **Automatically transforms modules** using Babel, PostCSS, and PostHTML when needed - even `node_modules`. +* ✂️ Zero configuration **code splitting** using dynamic `import()` statements. +* 🔥 Built in support for **hot module replacement** +* 🚨 Friendly error logging experience - syntax highlighted code frames help pinpoint the problem. ## Getting started @@ -74,7 +74,7 @@ Finally, existing bundlers are built around string loaders/transforms, where the `parcel` transforms a tree of assets to a tree of bundles. Many other bundlers are fundamentally based around JavaScript assets, with other formats tacked on - for example, by default inlined as strings into JS files. `parcel` is file-type agnostic - it will work with any type of assets the way you'd expect, with no configuration. -`parcel` takes as input a single entry asset, which could be any type: a JS file, HTML, CSS, image, etc. There are various asset types defined in `parcel` which know how to handle specific file types. The assets are parsed, their dependencies are extracted, and they are transformed to their final compiled form. This creates a tree of assets. +`parcel` takes as input a single entry asset, which could be any type: a JS file, HTML, CSS, image, etc. There are various asset types defined in `parcel` which know how to handle specific file types. The assets are parsed, their dependencies are extracted, and they are transformed to their final compiled form. This creates a tree of assets. Once the asset tree has been constructed, the assets are placed into a bundle tree. A bundle is created for the entry asset, and child bundles are created for dynamic imports, which cause code splitting to occur. Child bundles are also created when assets of a different type are imported, for example if you imported a CSS file from JavaScript, it would be placed into a sibling bundle to the corresponding JavaScript. If an asset is required in more than one bundle, it is hoisted up to the nearest common ancestor in the bundle tree so it is not included more than once. @@ -84,10 +84,9 @@ After the bundle tree is constructed, each bundle is written to a file by a pack All feedback and suggestions are welcome! -- 💬 Chat: Join us on [slack](https://slack.parceljs.org/). -- 📣 Stay up to date on new features and announcements on [@parceljs](https://twitter.com/parceljs). +* 💬 Chat: Join us on [slack](https://slack.parceljs.org/). +* 📣 Stay up to date on new features and announcements on [@parceljs](https://twitter.com/parceljs). ## License MIT - diff --git a/packages/core/parcel/package.json b/packages/core/parcel/package.json index 8a88162c711..21056105326 100644 --- a/packages/core/parcel/package.json +++ b/packages/core/parcel/package.json @@ -11,7 +11,6 @@ "babel-core": "^6.25.0", "babel-generator": "^6.25.0", "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", - "babel-to-estree": "^0.0.3", "babylon": "^6.17.4", "babylon-walk": "^1.0.2", "browser-resolve": "^1.11.2", @@ -34,8 +33,8 @@ "posthtml": "^0.10.1", "resolve": "^1.4.0", "serve-static": "^1.12.4", + "uglify-es": "^3.2.1", "strip-json-comments": "^2.0.1", - "uglify-js": "^3.0.28", "v8-compile-cache": "^1.1.0", "worker-farm": "^1.4.1", "ws": "^3.3.2" diff --git a/packages/core/parcel/src/HMRServer.js b/packages/core/parcel/src/HMRServer.js index aaa27908ad4..47a0053ba6a 100644 --- a/packages/core/parcel/src/HMRServer.js +++ b/packages/core/parcel/src/HMRServer.js @@ -44,7 +44,7 @@ class HMRServer { }); } - const containsHtmlAsset = assets.some(asset => asset.type === "html"); + const containsHtmlAsset = assets.some(asset => asset.type === 'html'); if (containsHtmlAsset) { this.broadcast({ type: 'reload' diff --git a/packages/core/parcel/src/WorkerFarm.js b/packages/core/parcel/src/WorkerFarm.js index 72c36ac4b6f..cd083d4c333 100644 --- a/packages/core/parcel/src/WorkerFarm.js +++ b/packages/core/parcel/src/WorkerFarm.js @@ -9,7 +9,7 @@ class WorkerFarm extends Farm { constructor(options) { let opts = { autoStart: true, - maxConcurrentWorkers: getNumWorkers(), + maxConcurrentWorkers: getNumWorkers() }; super(opts, require.resolve('./worker')); diff --git a/packages/core/parcel/src/transforms/uglify.js b/packages/core/parcel/src/transforms/uglify.js index c32187aa865..bbd15dfaa5d 100644 --- a/packages/core/parcel/src/transforms/uglify.js +++ b/packages/core/parcel/src/transforms/uglify.js @@ -1,18 +1,34 @@ -const {AST_Node, minify} = require('uglify-js'); -const {toEstree} = require('babel-to-estree'); -const types = require('babel-types'); -const walk = require('babylon-walk'); +const {minify} = require('uglify-es'); module.exports = async function(asset) { await asset.parseIfNeeded(); - // Convert to UglifyJS AST - var ast = AST_Node.from_mozilla_ast(toEstree(asset.ast, asset.contents)); - var result = minify(ast, { - toplevel: true - }); + // Convert AST into JS + let code = asset.generate().js; - // Uglify did our code generation for us, so remove the old AST + let options = { + warnings: true, + mangle: { + toplevel: true + }, + compress: { + drop_console: true + } + }; + + let result = minify(code, options); + + if (result.error) throw result.error; + + // Log all warnings + if (result.warnings) { + result.warnings.forEach(warning => { + // TODO: warn this using the logger + console.log(warning); + }); + } + + // babel-generator did our code generation for us, so remove the old AST asset.ast = null; asset.outputCode = result.code; asset.isAstDirty = false; diff --git a/yarn.lock b/yarn.lock index 6717b086e2e..86b87067267 100644 --- a/yarn.lock +++ b/yarn.lock @@ -673,15 +673,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: babylon "^6.18.0" lodash "^4.17.4" -babel-to-estree@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/babel-to-estree/-/babel-to-estree-0.0.3.tgz#8a6c5dc9e57d4f9d9397cd1aa98afc554f928824" - dependencies: - babel-traverse "^6.23.1" - babel-types "^6.23.0" - babylon "^6.16.1" - -babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-traverse@^6.26.0: +babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" dependencies: @@ -695,7 +687,7 @@ babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-tr invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.15.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24.1, babel-types@^6.26.0: +babel-types@^6.15.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" dependencies: @@ -712,7 +704,7 @@ babylon-walk@^1.0.2: babel-types "^6.15.0" lodash.clone "^4.5.0" -babylon@^6.16.1, babylon@^6.17.4, babylon@^6.18.0: +babylon@^6.17.4, babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" @@ -887,11 +879,11 @@ browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: electron-to-chromium "^1.2.7" browserslist@^2.1.2: - version "2.9.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.9.1.tgz#b72d3982ab01b5cd24da62ff6d45573886aff275" + version "2.10.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.10.0.tgz#bac5ee1cc69ca9d96403ffb8a3abdc5b6aed6346" dependencies: - caniuse-lite "^1.0.30000770" - electron-to-chromium "^1.3.27" + caniuse-lite "^1.0.30000780" + electron-to-chromium "^1.3.28" buffer-xor@^1.0.3: version "1.0.3" @@ -968,12 +960,12 @@ caniuse-api@^1.5.2: lodash.uniq "^4.5.0" caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000780" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000780.tgz#8d1977561d00ff0f0ed2b6b66140328ab4504c0a" + version "1.0.30000782" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000782.tgz#d8815bce1578c350aced1132507301205e0fab53" -caniuse-lite@^1.0.30000770: - version "1.0.30000780" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000780.tgz#1f9095f2efd4940e0ba6c5992ab7a9b64cc35ba4" +caniuse-lite@^1.0.30000780: + version "1.0.30000782" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000782.tgz#5b82b8c385f25348745c471ca51320afb1b7f254" caseless@~0.11.0: version "0.11.0" @@ -1195,8 +1187,8 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" core-js@^2.4.0, core-js@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" + version "2.5.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.2.tgz#bc4648656e7dc9dc80d7d3c7bbc172d96e744e63" core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -1537,7 +1529,7 @@ ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" -electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.27: +electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.28: version "1.3.28" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.28.tgz#8dd4e6458086644e9f9f0a1cf32e2a1f9dffd9ee" @@ -1570,10 +1562,10 @@ entities@^1.1.1, entities@~1.1.1: resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" errno@^0.1.1, errno@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + version "0.1.5" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.5.tgz#a563781a6052bc2c9ccd89e8cef0eb9506e0c321" dependencies: - prr "~0.0.0" + prr "~1.0.1" error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.1" @@ -3103,11 +3095,11 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" mixin-deep@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.2.0.tgz#d02b8c6f8b6d4b8f5982d3fd009c4919851c3fe2" + version "1.3.0" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.0.tgz#47a8732ba97799457c8c1eca28f95132d7e8150a" dependencies: for-in "^1.0.2" - is-extendable "^0.1.1" + is-extendable "^1.0.1" mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" @@ -3335,8 +3327,8 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" nyc@^11.1.0: - version "11.4.0" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-11.4.0.tgz#18634c24058c12a4b7c9872b846249fb96e30719" + version "11.3.0" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-11.3.0.tgz#a42bc17b3cfa41f7b15eb602bc98b2633ddd76f0" dependencies: archy "^1.0.0" arrify "^1.0.1" @@ -3361,7 +3353,7 @@ nyc@^11.1.0: resolve-from "^2.0.0" rimraf "^2.5.4" signal-exit "^3.0.1" - spawn-wrap "^1.4.1" + spawn-wrap "=1.3.8" test-exclude "^4.1.1" yargs "^10.0.3" yargs-parser "^8.0.0" @@ -3973,9 +3965,9 @@ promise@^7.1.1: dependencies: asap "~2.0.3" -prr@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" pseudomap@^1.0.2: version "1.0.2" @@ -4129,8 +4121,8 @@ regenerator-runtime@^0.10.5: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" regenerator-runtime@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" regenerator-transform@^0.10.0: version "0.10.1" @@ -4318,7 +4310,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@2, rimraf@^2.3.3, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: @@ -4558,16 +4550,16 @@ source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" -spawn-wrap@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.4.2.tgz#cff58e73a8224617b6561abdc32586ea0c82248c" +spawn-wrap@=1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.3.8.tgz#fa2a79b990cbb0bb0018dca6748d88367b19ec31" dependencies: foreground-child "^1.5.6" mkdirp "^0.5.0" os-homedir "^1.0.1" - rimraf "^2.6.2" + rimraf "^2.3.3" signal-exit "^3.0.2" - which "^1.3.0" + which "^1.2.4" spdx-correct@~1.0.0: version "1.0.2" @@ -4893,6 +4885,13 @@ typescript@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4" +uglify-es@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.2.2.tgz#15c62b7775002c81b7987a1c49ecd3f126cace73" + dependencies: + commander "~2.12.1" + source-map "~0.6.1" + uglify-js@^2.6, uglify-js@^2.8.29: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" @@ -4902,13 +4901,6 @@ uglify-js@^2.6, uglify-js@^2.8.29: optionalDependencies: uglify-to-browserify "~1.0.0" -uglify-js@^3.0.28: - version "3.2.1" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.2.1.tgz#d6427fd45a25fefc5d196689c0c772a6915e10fe" - dependencies: - commander "~2.12.1" - source-map "~0.6.1" - uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" @@ -5035,7 +5027,7 @@ which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" -which@1, which@^1.2.10, which@^1.2.9, which@^1.3.0: +which@1, which@^1.2.10, which@^1.2.4, which@^1.2.9: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" dependencies: