2015-05-18 2 views
5

का उपयोग कर मैं एक आइसोमोर्फिक एप्लिकेशन बना रहा हूं। यह पूरी तरह से प्रतिक्रिया के साथ बनाया गया है - अर्थात्, एचटीएमएल बेस भी प्रतिक्रिया में है।वेबपैक के साथ कैशिंग, [हैश] इंडेक्स स्रोत कोड के अंदर मूल्य, React.js

मेरे पास एक रूट घटक के रूप में मेरा रूट HTML है।

... 
var AppTemplate = React.createClass({ 
    displayName: 'AppTemplate', 
    render: function() { 
     return (
      <html> 
        <head lang="en"> 
         <title>hello</title> 
         <link rel="stylesheet" href='/css/style.css' /> 
        </head> 
        <body> 
         <RouteHandler {...this.props}/> 
         <script type='text/javascript' src='/js/bundle.js' /> 
        </body> 
       </html> 
     ); 
    } 
}); 
... 
module.exports = AppTemplate; 

जब मैं webpack के साथ इस परियोजना का निर्माण, मैं js/bundle.js को बदलने के लिए हैश शामिल करने की जरूरत:

वह कुछ इस तरह लग रहा है।

वेबपैक समाप्त होने के बाद आँकड़े। जेसन प्रदान करता है। लेकिन मुझे निर्माण समय के दौरान हैश उपलब्ध होना चाहिए।

... 
var AppTemplate = React.createClass({ 
    displayName: 'AppTemplate', 
    render: function() { 
     return (
      <html> 
        <head lang="en"> 
         <title>hello</title> 
         <link rel="stylesheet" href='/css/style.css' /> 
        </head> 
        <body> 
         <RouteHandler {...this.props}/> 
         <script type='text/javascript' src='/js/bundle.{__HASH__}.js' /> 
        </body> 
       </html> 
     ); 
    } 
}); 
... 
module.exports = AppTemplate; 

कौन सा आदर्श बनाया js में सही हैश संदर्भ डालेगी:

मैं की तरह कुछ करने के लिए सुविधा झंडे का उपयोग करने का सोच रहा था।

यह थोड़ा मुश्किल है क्योंकि यह स्वयं संदर्भ है। इसे करने का कोई बेहतर तरीका है? वेबपैक समाप्त होने के बाद निर्मित कोड को संशोधित करना प्रतिकूल प्रतीत होता है। मैंने क्लाइंट को बस bundle.js का अनुरोध करने के बारे में भी सोचा है, लेकिन मेरा नोड सर्वर हैशड फ़ाइल की सेवा करता है।

इस कैशिंग के लिए उचित समाधान क्या होगा?

उत्तर

4

ऐप में इसे प्रस्तुत करने का प्रयास करने के बजाय, मुझे पता चला कि ऐप में वेबपैक संपत्तियों को पारित करने का सबसे अच्छा समाधान है। यह सीधे प्रोप के माध्यम से या अपने प्रवाह के माध्यम से हो सकता है।

इस तरह आपका कोड एक चर के साथ प्रस्तुत किया जाता है। निर्माण प्रक्रिया के लिए आपके चर का मान अप्रासंगिक है।

... 
var AppTemplate = React.createClass({ 
    displayName: 'AppTemplate', 
    render: function() { 
     return (
      <html> 
        <head lang="en"> 
         <title>hello</title> 
         <link rel="stylesheet" href='/css/style.css' /> 
        </head> 
        <body> 
         <RouteHandler {...this.props}/> 
         <script type='text/javascript' src={this.props.jsFile} /> 
        </body> 
       </html> 
     ); 
    } 
}); 
... 
module.exports = AppTemplate; 

ऐसा कुछ।

7

ExtendedAPIPlugin आपके बंडल में __webpack_hash__ चर जोड़ता है, जो आप देख रहे हैं कि हो सकता है।

+0

यह वही था जो मैं ढूंढ रहा था। – Federico

0

आपको कभी भी अपने पूर्ण HTML को क्लाइंट पर प्रतिपादित नहीं करना चाहिए। आपके सिर और शरीर में आपके ऐप div के बाहर सब कुछ सिर्फ सर्वर से भेजा जाना चाहिए। इस तरह आपकी समस्या तुरंत हल हो जाती है, क्योंकि आपके क्लाइंट-साइड जावास्क्रिप्ट को यह जानने की आवश्यकता नहीं है कि यह किस फाइल में रहता है, और सर्वर पर आप आंकड़े तैयार होने की प्रतीक्षा कर सकते हैं।

+1

यह एक आइसोमोर्फिक ऐप है। यह प्रतिक्रिया ऐप सर्वर पर प्रस्तुत की जाती है, 'React.renderToString() 'के साथ। यह एक स्ट्रिंग (या घटक के दृश्य भाग) प्रस्तुत करता है। इसमें ऐप के बाहर सिर और सबकुछ शामिल है और सर्वर से नीचे भेजा गया है। क्लाइंट पर, आपको दस्तावेज़ को सटीक उसी प्रतिक्रिया ऐप के साथ 'रीहाइड्रेट' करना होगा। क्लाइंट पर आप 'React.render()' करते हैं जो दृश्य + कार्यक्षमता/ईवेंट हैंडलर प्रस्तुत करेगा। – Federico

+0

निश्चित रूप से, लेकिन आपको क्लाइंट पर पूर्ण HTML को रीहाइड्रेट करने की कोशिश नहीं करना चाहिए (सभी स्क्रिप्ट टैग समेत), जो कि केवल अनियंत्रित है। आपके शरीर के बाहर कुछ भी रनटाइम पर आम तौर पर बदल नहीं जाएगा। एक अच्छे उदाहरण के लिए यहां देखें: https://github.com/yahoo/flux-examples/tree/master/fluxible-router मूल रूप से: अपने शरीर के अंदर एक ऐप div बनाएं, अपनी वास्तविक प्रतिक्रिया ऐप को स्ट्रिंग में प्रस्तुत करें और इसे ऐप div के अंदर प्रिंट करें। फिर बाहरी HTML प्रस्तुत करें और इसके अंदर प्रस्तुत ऐप div डालें। फिर ऐप div में अपने ऐप को फिर से बहाल करें। मैंने [हैश] सहित, एक बहुत बड़ा फ्लक्सिबल ऐप बनाया है, बहुत अच्छा काम करता है! – Ambroos

संबंधित मुद्दे