2013-07-09 26 views
3

在Sails.js應用程序中,如何選擇性地包含javascript資源?如何在SailsJS中選擇性地包含JavaScript資產?

例如,如果我有一個管理頁面,admin.js位於assets/js目錄中。如何讓admin.js在公共索引頁面上加載?

我知道我可以將js移動到公共目錄,並將腳本包含在我的管理視圖模板中。但我仍然無法將其包含在assets.js()調用中插入它的javascript。我需要將它插入sails.io.js腳本加載後。

有什麼辦法,以有選擇地加載腳本,仍然可以訪問sails.io.js這是自動包含在assets.js()函數調用?這種情況有沒有更好的範例?

編輯:

由於SailsJS 0.9版本和資產管理系統的調整,這個問題並沒有真正將不再適用。

回答

0

是的,你把條件放在模板中。 :)

或爲您的js添加另一個「塊」。

extends ../layout 

block body 
    <h1>hello</h1> 

block jsscripts 
    <scripts> ..... </script> 
+0

在管理模板中添加條件仍然會導致腳本在** sails.io.js腳本之前被加載**。我如何得到它後加載?我是否必須將'<% - assets.js()%>'行從layout.ejs移出到我的管理模板中?那會導致我必須對我所有的觀點都這樣做。 – albiabia

+0

林不知道,但我認爲socketio首先加載。也許你可以添加一個監聽器來檢查socketio是否已經加載。 – bwaaaaaa

1

Sailsjs使用資產架服務/資產。使用默認的頁面佈局,sailsjs供應,看起來像(dummy2.js附帶明確的< SCRIPT>)網頁:

<html> 
    <head> 
    ... 
    <script type="text/javascript" src="/assets/mixins/sails.io-d338eee765373b5d77fdd78f29d47900.js"></script> 
    <script type="text/javascript" src="/assets/js/dummy0-1cdb8d87a92a2d5a02b910c6227b3ca4.js"></script> 
    <script type="text/javascript" src="/assets/js/dummy1-8c1b254452f6908d682b9b149eb55d7e.js"></script> 
    </head> 
    <body> 
    ... 
    <script src="/public/dummy2.js"></script> 
    ... 
    </body> 
</html> 

所以sailsjs不連接文件(至少不是在開發模式下)。 sails.io(socket-io)始終包含在佈局中的/ assets/js之前,以及頁面上的<腳本>之前。

它看起來像你的admin.js期待sails.io還沒有設置的條件,也許它與服務器協商一個傳輸?嘗試等待條件設置。

+0

也許我沒有使用相同版本的風帆。但是默認的佈局頁面在關閉body標籤之前包含了sails.io.js。 – albiabia

+0

的確,sails.io應該與< script >一起服務。您可以將該標籤放置在您需要的位置以正確加載您的資產。 – JohnSz

1

在Sails.js應用程序中,如何選擇性地包含JavaScript資源?

我有選擇地使用assets.js()包裝器加載js資產。這段代碼使用Jade的「 - 」和「!{...}」。 EJS將改用 「<%...%>」 和 「<%= ...%>」

<!-- JavaScript and stylesheets from your assets folder are included here --> 
!{assets.css()} 
-function selectAssets (assetsjs, files, ifInclude) { 
- return assetsjs.split('\n').reduce(function (prev, curr, i) { 
- var frag = curr.match(/src="\/assets\/js\/\w{1,}\-/); 
- if(frag) { 
-  var file = frag[0].substring(16, frag[0].length - 1); 
-  if ((files.indexOf(file) === -1) == ifInclude) { return prev; } 
- } 
- return prev + curr + '\n'; 
- }, ''); 
-} 
//!{assets.js()} this line is replaced by: 
!{selectAssets(assets.js(), ['dummy1', 'dummy5', 'dummy6'], false)} 

上面將不包括/assets/js/dummy1.js,dummy5,dummy6與佈局。如果您想在特定頁面上包含dummy1和dummy5,您應該在該頁面上放置

!{selectAssets(assets.js(), ['dummy1', 'dummy5'], true)} 

注意:代碼假定文件名不包含「 - 」。其直接推廣爲CSS和模板。 sails-io是mixin的特例。

0

要回答部分有關包含文件所在位置的問題。

在0.10版本的文件順序設置在文件tasks/values/injectedFiles.js,我記得在以前的版本中,它確定在Gruntfile.js本身。

1

我知道這是一個老問題,但因爲人們仍在尋找這個問題。

在創建新項目後,Sails在根中有一個稱爲任務的文件夾。

你要找的文件是

pipeline.js

該文件保存了一個名爲jsFilesToInject

// Client-side javascript files to inject in order 
// (uses Grunt-style wildcard/glob/splat expressions) 
var jsFilesToInject = [ 

    // Load sails.io before everything else 
    // 'js/dependencies/sails.io.js', 
    'js/sails.io.js' 


    // Dependencies like jQuery, or Angular are brought in here 
    'js/dependencies/**/*.js', 

    // All of the rest of your client-side js files 
    // will be injected here in no particular order. 
    'js/**/*.js' 
]; 

只要把你的腳本,你想開航前加載變量.io.js。

這是相關帆0.11.x

另一種方式是有效的是創建一個視圖/諧音文件夾

,並創建一個新的文件中像mapScripts.ejs 下降腳本標記出現在您的視圖中使用

<% include ../partials/mapScripts %> 
+0

如何在html文件中使用它?我簡單的app.html下的意見文件夾,當我使用像src =「/ js/bundle.js」它不起作用。 –

+0

你把javascript文件放在assets/js文件夾中了嗎?我假設你已經安裝了最新版本的sails.js,所以如果你發現要遵循一箇舊的教程,用'--linker'命令'sails new <你的項目名稱>'可能會弄亂正確提供的資源,所以不再需要它了使用該標誌。它也不是一個html文件,它是一個.ejs文件,可能會弄亂配置。 – Mitchell

0

可以在任務/ pipeline.js您的自定義文件的補充參考

var jsFilesToInject = [ 
    'js/dependencies/sails.io.js', 
    'js/dependencies/**/*.js', 
    'js/**/*.js', 
    'js/yourcustomFile.js' 
];