@@ -3,6 +3,7 @@ const path = require('path');
33const Packager = require ( './Packager' ) ;
44const urlJoin = require ( '../utils/urlJoin' ) ;
55const lineCounter = require ( '../utils/lineCounter' ) ;
6+ const objectHash = require ( '../utils/objectHash' ) ;
67
78const prelude = {
89 source : fs
@@ -35,13 +36,14 @@ class JSPackager extends Packager {
3536 }
3637
3738 async addAsset ( asset ) {
38- if ( this . dedupe . has ( asset . generated . js ) ) {
39+ let key = this . dedupeKey ( asset ) ;
40+ if ( this . dedupe . has ( key ) ) {
3941 return ;
4042 }
4143
4244 // Don't dedupe when HMR is turned on since it messes with the asset ids
4345 if ( ! this . options . hmr ) {
44- this . dedupe . set ( asset . generated . js , asset . id ) ;
46+ this . dedupe . set ( key , asset . id ) ;
4547 }
4648
4749 let deps = { } ;
@@ -60,7 +62,7 @@ class JSPackager extends Packager {
6062 deps [ dep . name ] = bundles ;
6163 this . bundleLoaders . add ( mod . type ) ;
6264 } else {
63- deps [ dep . name ] = this . dedupe . get ( mod . generated . js ) || mod . id ;
65+ deps [ dep . name ] = this . dedupe . get ( this . dedupeKey ( mod ) ) || mod . id ;
6466
6567 // If the dep isn't in this bundle, add it to the list of external modules to preload.
6668 // Only do this if this is the root JS bundle, otherwise they will have already been
@@ -93,6 +95,14 @@ class JSPackager extends Packager {
9395 return name ;
9496 }
9597
98+ dedupeKey ( asset ) {
99+ // cannot rely *only* on generated JS for deduplication because paths like
100+ // `../` can cause 2 identical JS files to behave differently depending on
101+ // where they are located on the filesystem
102+ let deps = Array . from ( asset . depAssets . values ( ) , dep => dep . name ) . sort ( ) ;
103+ return objectHash ( [ asset . generated . js , deps ] ) ;
104+ }
105+
96106 async writeModule ( id , code , deps = { } , map ) {
97107 let wrapped = this . first ? '' : ',' ;
98108 wrapped +=
0 commit comments