2017-10-04 5 views
0

ロールアップ、commonjs、es6、およびツリーの揺れが正しく機能するようにしようとしています。CommonJSでロールアップし、トレシェイクを使用してインポートとエクスポートを行います。

現在、私は次のビルドスクリプトを持っている:

main.jsファイル

const { firstFunction } = require('./exports'); 

firstFunction(); 

をロードし、export.jsファイル

export function firstFunction() { 
    return this.name; 
} 

export function secondFunction() { 
    return this.name; 
} 

は以下を出力

'use strict'; 

const rollup = require('rollup'); 
const resolve = require('rollup-plugin-node-resolve'); 
const commonjs = require('rollup-plugin-commonjs'); 

rollup.rollup({ 
    input: 'main.js', 
    format: 'iife', 
    plugins: [ 
    { 
     transform(code, id) { 
     return code; 
     } 
    }, 
    resolve({ 
     extensions: ['.js', '.jsx'] 
    }), 
    commonjs({ 
     extensions: ['.js', '.jsx'] 
    }) 
    ] 
}) 
.then(({ generate }) => generate({ 
    format: 'iife', 
    name: 'test', 
})) 
.then(({ code }) => console.log(code)); 

var test = (function() { 
'use strict'; 

function firstFunction$1() { 
    return this.name; 
} 

function secondFunction() { 
    return this.name; 
} 


var exports$1 = Object.freeze({ 
    firstFunction: firstFunction$1, 
    secondFunction: secondFunction 
}); 

var require$$0 = (exports$1 && undefined) || exports$1; 

const { firstFunction } = require$$0; 

firstFunction(); 

var main = { 

}; 

return main; 

}()); 

これは正しい動作であれば、私はわからないです、私はES6 export.jsファイルをツリー揺れを使用することができるだろうと仮定し、したがって、私たちのバンドルされたコードにexport.jsからsecondFunction()をインポートする必要はありませんでした。

私は多くの設定の組み合わせを試しましたが、何も木の揺れを働かせることはできないようです。

私はサーバ上でcommonjsを使用していて、同じファイルをクライアントにバンドルして使用していることに気づく価値があります - これが私にcjsとes6が混在している理由です。

+0

可能であればrequireの代わりにimportを使用してください。 – Lux

+0

@Luxノード上で実行されているmain.jsにcommonjsを使用する必要があります。 – Prisoner

+0

'export.js'で' export'を使うと意味がありません( 's'は入力ミスであると仮定します)。また、あなたはその 'import'を翻訳します。ロールアップの全体のアイデアは、すべての 'import'を取り除き、1つの単一のIIFE(またはあなたが望むもの)で置き換えることです。 – Lux

答えて

1

コメントでLuxが述べたように、問題はcjsとESモジュールを混在させていることです。 rollup-plugin-commonjsは輸入品を譲渡していないようです。

まず、ファイルをロールアップでバンドルし、出力フォーマットとしてcjsを使用する必要があります。あなたはrequireバンドルです。

これは、あなたのjavascriptを取得し、ノードの準備ができているはずです。

+0

他のコメントで述べたように、私はサーバ上でcommonjsを使用しています。このコードをクライアントと共有したいのです(jsxで書かれたビューファイルです)。 100%がcommonjsをtreeshakeにする方法がないと言っているなら、私は他の解決策を見ていきますが、cjsがes6という名前のエクスポートファイルを必要としているという事実を思い出します。 – Prisoner

+0

私はあなたにあまりよく従いません。 'main.js'の' require'を 'import'に変更できませんか? – destoryer

+0

なぜなら、ノードはそれを実行できないからです。 es6という名前のエクスポートはまだノードでは使用できません。 – Prisoner

関連する問題