7

मैं कुछ जावास्क्रिप्ट फ़ाइलों को ऑप्टिमाइज़ करने के लिए एएसपी.Nets बंडलटेबल का उपयोग करने की कोशिश कर रहा हूं, लेकिन एक समस्या में भाग लिया है जहां कोड को छोटा होने पर एक विशिष्ट एडन (jQuery-Timepicker) काम करने में विफल रहता है। here देखें। अगर मैं jquery-ui-timepicker-addon.js फ़ाइल को हटा, तो यह मेरी वेबपेज में अलग शामिल है, तो यह ठीक से काम करताएक फ़ाइल को छोटा करने से छोड़ें?

// Add our commonBundle 
var commonBundle= new Bundle("~/CommonJS" + culture.ToString()); 

// JQuery and related entries. 
commonBundle.Include("~/Scripts/jquery-1.7.2.js"); 
commonBundle.Include("~/Scripts/jquery-ui-1.8.22.js"); 
commonBundle.Include("~/Scripts/jquery.cookie.js"); 
commonBundle.Include("~/Scripts/jquery-ui/jquery-ui-timepicker-addon.js"); // This is the one that does not work when bundled 

// JS Transformer 
commonBundle.Transforms.Add(new JsMinify()); 

BundleTable.Bundles.Add(commonBundle); 

:

बंडल कोड वर्तमान के समान है। (अन्यथा मुझे Uncaught TypeError: undefined is not a function त्रुटि मिलती है)।

मुझे आश्चर्य है कि क्या मैं किसी भी तरह से एक फ़ाइल को छोटा करने के लिए अपने बंडल कोड को सेट कर सकता हूं (लेकिन अभी भी इसे बंडल में शामिल किया गया है)? मैं चारों ओर देख रहा हूं लेकिन ऐसा करने के लिए किसी भी समाधान के साथ नहीं आया है।

+0

क्या आप ट्रांसफॉर्म के बाद टाइमपिकर के लिए 'सामान्य बंडल' शामिल नहीं कर सकते हैं? – Toby

उत्तर

2

तो मुद्दा यह है कि सभी फाइलें एक साथ बंडल की जाती हैं, और फिर पूरे बंडल को कम किया जाता है। नतीजतन आप आसानी से सिर्फ एक फ़ाइल के खनन को छोड़ने में सक्षम नहीं होंगे। ऐसा करने का शायद सबसे अच्छा तरीका एक नया ट्रांसफॉर्म बनाना होगा जो इस फ़ाइल की सामग्री को जोड़ता है जिसे आप असम्बद्ध चाहते हैं। तो फिर तुम यह आपके पंजीकृत ScriptBundle को रूपांतरण संलग्न करेंगे:

commonBundle.Transforms.Add(new AppendFileTransform(""~/Scripts/jquery-ui/jquery-ui-timepicker-addon.js"")); 

AppendFileTransform बस बंडल जवाबी कार्रवाई के लिए फ़ाइल की सामग्री को संलग्न करेंगे। अब आप बंडल में टाइमपिकर को स्पष्ट रूप से शामिल नहीं करेंगे, लेकिन इसके बजाय इस परिवर्तन में यह शामिल होगा, और यह प्रभावी रूप से आपको वह व्यवहार देगा जो आप देख रहे हैं क्योंकि JsMinify ट्रांसफॉर्म पहले चलेंगे और बंडल को कम करेगा, और फिर आप जोड़ देंगे फ़ाइल जो आप अंत में असीमित चाहते हैं।

+0

हां, आप सही हैं, लेकिन फ़ाइल संशोधित होने पर यह बंडल को फिर से नहीं बनाएगा। इस मामले में शायद स्वीकार्य है, लेकिन सामान्य समाधान की तरह नहीं। – Nenad

+0

AppendFileTransform कोड पर कोई संकेत? – Spikolynn

1

आप कुछ फ़ाइलों को छोटा करने और बाकी फ़ाइलों को कम करने के लिए बंडल सेट अप नहीं कर सकते हैं।

आप Bundle या TransformBundle.ApplyTransform या JsMinify.Process तरीकों अधिभावी द्वारा अपने स्वयं के लागू कर सकता है, लेकिन आप नहीं फ़ाइलों के परिवर्तन ट्रैकिंग, कुंजी पीढ़ी, कैश अमान्यकरण, आदि ... तोड़ने के लिए देखभाल करने के लिए की आवश्यकता होगी (या कुछ बदसूरत कर हैक)। यह प्रयास के लायक नहीं है।

जैसा कि आपने पहले ही उल्लेख किया है, मैं अलग जेएस फ़ाइल रखूंगा।

2

इसे किसी अन्य फ़ाइल से बेहतर हल किया जा सकता है - बजाय एक फ़ाइल को छोटा करने की कोशिश करने के बजाय, अलग-अलग वस्तुओं के लिए रूपांतरण जोड़ें।

पहले - एक वर्ग है कि IItemTransform लागू करता है और दिए गए इनपुट कम करें करने के लिए एक ही कोड का उपयोग करता है बनाने के लिए:

public class JsItemMinify : System.Web.Optimization.IItemTransform 
{ 
    public string Process(string includedVirtualPath, string input) 
    { 
     var min = new Microsoft.Ajax.Utilities.Minifier(); 
     var result = min.MinifyJavaScript(input); 
     if (min.ErrorList.Count > 0) 
      return "/*minification failed*/" + input; 

     return result; 
    } 
} 

दूसरा - यह आइटम अलग-अलग फ़ाइलों को बदलने और बंडल हटाने जोड़ने परिणत:

var commonBundle= new Bundle("~/CommonJS"); 
// the first two includes will be minified 
commonBundle.Include("~/Scripts/jquery-1.7.2.js", new JsItemMinify()); 
commonBundle.Include("~/Scripts/jquery-ui-1.8.22.js", new JsItemMinify()); 

// this one will not 
commonBundle.Include("~/Scripts/jquery.cookie.js"); 

// Remove the default JsMinify bundle transform 
commonBundle.Transforms.Clear(); 

BundleTable.Bundles.Add(commonBundle);