2017-05-17 4 views
1

私はユーティリティライブラリを持っています:goodcore 私は別のプロジェクトで使っています。それはうまく動作しますが、Rollupを使用してバンドルしてtreeshakeすると、インクルードされたファイルの一部にリンクがない非常に小さな部分しか使用しなくても、常にグッドコアライブラリ全体が含まれます。なぜRollup.jsが私のライブラリーを振り払うのですか

両方のプロジェクトはTypescriptで、ES2015モジュールの読み込みを使用します。

私が使用してgoodcoreライブラリを参照:それでも私はに含まれ、木のように、goodcoreからすべてで終わる

export { Vec2 as Vec2 } from "./struct/Vec2"; 
export { Range2 as Range2 } from "./struct/Range2"; 
export { Rect as Rect } from "./struct/Rect"; 
export { List as List } from "./struct/List"; 
export { Dictionary as Dictionary } from "./struct/Dictionary"; 
export { Stack as Stack } from "./struct/Stack"; 
export { Tree as Tree } from "./struct/Tree"; 
export { Calc as Calc } from "./Calc"; 
export { Dom as Dom } from "./Dom"; 
export { Arr as Arr } from "./Arr"; 
export { Obj as Obj } from "./Obj"; 
export { Util as Util } from "./Util"; 
export { Timer as Timer } from "./Timer"; 
export { Uri as Uri } from "./Uri"; 
export { Poolable as Poolable } from "./standard/mixins/Poolable"; 
export { Initable as Initable } from "./standard/mixins/Initable"; 
export { Pool as Pool } from "./standard/Pool"; 
export { Integrate as Integrate } from "./Integration"; 
export { MocData as MocData } from "./MocData"; 
export { Cache as Cache } from "./standard/Cache"; 
export { KeyValuePair as KeyValuePair } from "./struct/KeyValuePair"; 
//# sourceMappingURL=index.js.map 

import { Arr, Pool, Range2, Timer, Util, Vec2 } from "goodcore"; 

とgoodcoreでindex.jsは次のようになります他のプロジェクトの私のロールアップビルド、私は印象を受けていたが、treeshakingは使用/参照されていないものを削除する必要があります。

他のプロジェクトのためのロールアップの設定は次のようになります。私は間違って何をやっている

var packageJson = require("./package.json"); 
import resolve from 'rollup-plugin-node-resolve'; 
import typescript from 'rollup-plugin-typescript2'; 
export default { 
    entry: 'src/lib/index.ts', 
    targets: [ 
      { dest: 'dist/' + packageJson.name + '.umd.js', format: 'umd' }, 
      { dest: 'dist/' + packageJson.name + '.es.js', format: 'es' }, 
      { dest: 'dist/' + packageJson.name + '.iife.js', format: 'iife' } 
    ], 
    moduleName: packageJson.name, 
    external: ['ts-md5/dist/md5'], 
    sourceMap: true, 
    globals: { 
    }, 
    treeshake: true, 
    plugins: [ 
     typescript({ 
      typescript: require('typescript') 
     }), 
     resolve({ module: true, jsnext: false, main: true, modulesOnly: true }) 
    ] 
} 

答えて

2

正確性を保証するために、ロールアップには副作用があるようなコードが含まれています。fooがインポートされていないにもかかわらず、このバンドルは 'hello from foo.js'に記録されますmain.jsによって:goodcoreの場合

/*--- main.js ---*/ 
import './foo.js'; 

/*--- foo.js ---*/ 
export function unused() { 
    // this will be omitted... 
} 

// but this will be included, because it has an effect on the world 
console.log('hello from foo.js'); 

すべては、それが副作用を持っている可能性があるかのようにロールアップすることになります。たとえば、Calc_Calc()を呼び出した結果であり、_Calc()に影響があるかどうかを判断することは非常に難しいため、Calcがバンドルで使用されているかどうかにかかわらず含まれている必要があります。あなたはsee this in the REPLすることができます。

残念なことに、このコードを賢明にすることは、おそらくかなり大きな設計変更を伴うことになります。また、TypeScriptが非Treeshakeable構造を導入している可能性もあります。

+0

ありがとうございました!いくつかのテストの後、私はそれが_Calcだけでなく静的なプロパティでもあることに気がついたので、iframeなどに注入するときにそれを工場として使うことができるようになってから削除できる_Calcのこと。意味私はCalcにasignmentと、すべての静的関数を削除する必要があります。 (解決策はありますか?) – JGoodgive

+0

はい - 定義をIIFEにラップしないでください([gist参照](https://gist.github.com/Rich-Harris/7861d982561a4d1457171ed783cde49c) - 残念ながら、私はREPLに直接リンクしています)。問題は、TypeScriptによって生成されたコードです。これは、私が 'non-treeshakeable constructs'を参照していたものです。 –

+0

将来のユーザーのために、静的なプロパティや関数を厳密に避けることで解決できます。あなたがグローバル変数の一種としてそれを必要とする場合、その状態を別のクラスに投げることよりも必要とするならば、それは常に含まれますが、残りの部分はtreeshakeableになります。 – JGoodgive

関連する問題