2017-05-17 26 views
1

我有一個實用程序庫:goodcore 我正在使用另一個項目。它工作正常,但是當我使用Rollup捆綁和樹形打開它時,它始終包含整個goodcore庫,即使我只使用其中一小部分沒有鏈接的東西,對於某些包含的文件也是如此。爲什麼不Rollup.js樹木我的圖書館

這兩個項目都是Typescript並使用ES2015模塊加載。

我使用引用goodcore庫:

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

和goodcore的index.js看起來像:

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 

不過我結束了一切從goodcore,外樹形像,包括在我的另一個項目的彙總構建,而我的印象是樹木應該刪除沒有使用/引用的東西。

的彙總配置的其他項目如下:

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

爲了確保正確性,Rollup將包含看起來可能有副作用的任何代碼 - 給出一個簡單的示例,即使foo未導入,此捆綁包也會導致「來自foo.js的hello」通過main.js

/*--- 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'); 

在goodcore的情況下,一切看起來彙總好像它可能有副作用。例如,Calc是調用_Calc()的結果,並且由於很難確定_Calc()是否具有效果,因此無論該包是否使用Calc,都必須將其包含在內。你可以see this in the REPL

不幸的是,使這個代碼樹狀可能會涉及相當大的設計變化。 TypeScript也可能引入了非樹狀構造。

+0

哦,謝謝! _Calc的東西,我可以刪除,因爲它只是能夠使用它作爲一個工廠時注入一個iframe等經過一些測試,我注意到它不僅是_Calc,但它的靜態屬性。這意味着我必須去除Calc的賦值以及所有靜態函數。 :(有沒有解決方案? – JGoodgive

+0

是的 - 不要將定義包裹在IIFE中([見要點](https://gist.github.com/Rich-Harris/7861d982561a4d1457171ed783cde49c)) - 不幸的是SO不會讓我直接鏈接到REPL)麻煩的是,這是由TypeScript生成的代碼,這正是我所指的'非樹狀結構'。 –

+0

對於未來的用戶,它可以通過嚴格避免靜態屬性或函數來解決任何類,如果你需要它作爲一種全局變量,而不是把這個狀態放到一個單獨的類中,那麼它總是被包含在內,但讓剩下的變成可樹狀的。 – JGoodgive