2014-02-26 13 views
1

我在JavaScript文件裏面使用了一些PHP。我也使用minify庫(https://code.google.com/p/minify/)來縮小樣式表和javascript。 我重寫請求的script.js到的script.php和運行script.php我這樣做(代碼是抽象的,所以沒有任何意義):您可以在使用minify庫進行縮小的.js文件中使用PHP嗎?

<?php header("Content-Type: application/x-javascript"); 
$var = 'hi'; ?> 
$(document).ready(function() { 
    alert('<?php echo $var ?>'); 
}); 

當我直接就要求的script.js作品。當我將它包含在要縮小的字符串中時,如下所示:

<script type="text/javascript" src="min/b=javascript&amp;f=script.js"></script> 

它給了我一個400個錯誤的請求。我已經在minify配置中將調試變量設置爲true。沒有結果。這僅僅是不可能的嗎?或者我做錯了什麼?我無法找到關於此主題的任何其他問題。

+0

什麼是php文件的名稱?它看起來像你的src是一個不正確的URL。至少你需要一個?開始查詢字符串,但它是min.php或min/index.php或別的什麼? –

+1

這是一個命令行工具?如果是這樣,你應該可以使用一點bash來使它工作。像'php source.php | minify> source.min.js' –

+0

我幾乎在每個項目中都使用了minify庫。我確切地知道它是如何工作的,而且問題不是拼寫錯誤的src。請注意,禁用從js到php的重寫會導致文件被正確縮小(如果存在)。這個?在src中不需要,因爲/ min文件夾中的.htaccess會正確地重寫URL。我猜這個問題應該在請求頭文件或其他.htaccess規則中的某個地方正確地提供te文件。 –

回答

1

你應該從你的js代碼中分別發送這個變量,例如在一個配置json文件或者你的html等腳本標記中......
之後,你的腳本將不會依賴於php變量所以它們將是靜態的和可微型的。

一些解釋:

好的首先。 Php在服務器上運行,JavaScript運行在客戶端的瀏覽器上。這些是完全不同的機器和不同的平臺。我希望你明白這一點。
爲了維護(開發,調試等)代碼,我們必須組織它。 Mixin php和JavaScript代碼使事情非常無組織。如果你想調試一個php功能,你想閱讀php代碼,而不是js代碼,反之亦然。它被稱爲嘈雜的代碼,你的js代碼中存在php噪音,或者你的php代碼中存在js噪音。爲了避免像html這樣的簡單語言出現這些問題,我們使用模板,通過像javascript這樣複雜的語言,我們應該創建一個應用程序接口,並且通過該接口應該客戶端js和服務器端PHP應用程序進行通信,發送數據等......它是好的,因爲它是受控的,有組織的等......,我們總是知道數據來自哪裏,如果你想找到一個錯誤的來源或理解當前代碼的工作方式,這就非常重要。通過這種規模的代碼是不相關的,但在百行,你會感覺不一樣......

您可以找到有關這幾個問題,我想你應該閱讀這一個: https://softwareengineering.stackexchange.com/questions/126671/is-it-considered-bad-practice-to-have-php-in-your-javascript

+0

這是一個將PHP變量傳遞給腳本的解決方案,但是一些內聯腳本非常容易變得更復雜。我只是好奇這是否可能。無論如何感謝您的答案。 –

+1

理論上可能的,實際上不是,uglifier應該知道兩種語言......這種混合語言的方式並不是一個好習慣......順便說一句,只要你發送一個變量從php到js,就應該使用json_encode,除非你想要被XSS攻擊。 – inf3rno

+0

我會追加我的答案爲什麼你不應該這樣做。 – inf3rno

1

從技術上講這是可能的如果使用Minify_Source對象而不是靜態文件路徑。例如。您可以使用PHP腳本的輸出作爲輸入源來縮小。

文檔has a section on this並提到了它的侷限性。

如果腳本的輸出每個用戶或經常更改,您可能不想這樣做。

+0

感謝您的文檔參考。你可能是對的,因爲首先在javascript內部創建PHP的人可能希望使其成爲動態的。如果您要縮小該輸出,則只能將結果呈現給使用與用於縮小腳本完全相同的變量的客戶端。 –

相關問題