2016-11-07 13 views
7

मैंने वेबपैक 2 में अपग्रेड किया है और मेरे बंडल आकार को हिलाते हुए पेड़ बढ़ने से पहले। जांच करते समय ऐसा क्यों लगता है कि मेरे पास bn.js और eliptic (नोड-लिब्स-ब्राउज़र की कुछ निर्भरताएं हैं - जो स्वयं वेबपैक 2 की निर्भरता है) जैसी बड़ी फ़ाइलें हैं। क्या इन्हें हटाने या उन्हें बाहर करने का कोई तरीका है? वेबपैक 1 में वे मेरे बंडल में नहीं जोड़े जा रहे थे।वेबपैक 2 नोड-libs-browser बहिष्कृत?

+0

अभी भी वही समस्या है; क्या तुम्हें कभी कोई हल मिला? पेड़ हिलाने के बाद भी मेरा हिस्सा आकार बहुत बड़ा है (मेरे विक्रेता खंड के लिए लगभग 25% बड़ा)। –

+0

हमने पाया कि फ़ाइलों को शामिल किया जा रहा है वेबपैक पॉलीफिल के परिणामस्वरूप (बीएनजेजे को नोड क्रिप्टो का उपयोग करने के लिए पॉलीफिल के रूप में शामिल किया जा रहा है) और वे बस वेबपैक 1 से बड़े होने लगते हैं (मुझे लगता है) – Carlo

+0

आह, हाँ, मैं पता था कि वे वेबपैक पॉलीफिल थे, लेकिन मुझे समझ में नहीं आता कि अब अतिरिक्त क्यों शामिल किए जा रहे हैं। वेबपैक * केवल उस पॉलीफिल को शामिल करना चाहिए जो इसे आवश्यकतानुसार पहचानता है और यह बहुत सारी चीजों में खींच रहा है जिसकी आवश्यकता नहीं है। मैं NormalModuleReplacementPlugin का उपयोग उन लोगों को रोकने के लिए कर रहा हूं जिन्हें मैं जानता हूं कि मुझे 'नोड-नोप' की आवश्यकता नहीं है जो आकार के मुद्दे को हल करता है, लेकिन यह संभव है कि मैं गलत लोगों को बाहर निकाल दूंगा - मैं वास्तव में वेबपैक करना चाहता हूं केवल इतना ही पकड़ा कि इसे पूरी तरह से बहुत ज्यादा चाहिए। –

उत्तर

4
समस्या

है, क्योंकि डिफ़ॉल्ट रूप से webpack अपने आंतरिक प्लगइन NodeSourcePluginhere या here for webworker लागू होता है, और आप एक मॉड्यूल भी crypto की तरह एक NodeJS मॉड्यूल का संदर्भ देता है, यानी अगर: var Crypto = canUseDom ? null : require("crypto"), webpack बड़ी फ़ाइलों NodeJS अनुकरण का एक समूह बंडल जाएगा । https://github.com/webpack/webpack/issues/4976 दायर की गई समस्या देखें।

समाधान किसी भी कोड से बचने के लिए है जो नोडजेएस आंतरिक मॉड्यूल का संदर्भ देता है, भले ही वे ब्राउज़र पर उपयोग नहीं किए जाते हैं।

इन्हें पकड़ने के लिए, आप target विकल्प को ओवरराइड करके NodeSourcePlugin निकाल सकते हैं।

const webpack = require("webpack"); 
const FunctionModulePlugin = require("webpack/lib/FunctionModulePlugin"); 

const output = { 
    path: process.cwd() + "/build", 
    filename: "bundle.[hash].js" 
}; 

{ 
    target:() => undefined, 
    output, 
    plugins: [ 
    new webpack.JsonpTemplatePlugin(output), 
    new FunctionModulePlugin(output), 
    new webpack.LoaderTargetPlugin("web"), 
    ] 
} 

संपादित करें: webpack 3 के साथ, यह अब के रूप में आसान है के रूप में:

const webpackConfig = { 
    node: false 
} 

आप कोड केवल और संदर्भ NodeJS मॉड्यूल, यह अपने स्वयं के मॉड्यूल में उन अलग करने के लिए बेहतर है सर्वर साइड के लिए है कि होना आवश्यक हैं , और package.json में browser फ़ील्ड के माध्यम से एक डमी कॉपी निर्यात करें।

संपादित करें: मैंने इस समस्या से संबंधित एक ब्लॉग यहां लिखा है https://medium.com/walmartlabs/webpack-optimization-a-case-study-92b130334b6c