如何在SailsJS中有选择地包含javascript资源?

时间:2013-07-09 20:27:23

标签: javascript node.js express sails.js

在Sails.js应用程序中,如何有选择地包含javascript资源?

例如,如果我有一个管理页面,admin.js位于assets / js目录中。如何在公共索引页面上加载admin.js?

我知道我可以将js移到公共目录,并将脚本包含在我的管理视图模板中。但是在 assets.js()调用插入javascript之后,我仍然无法包含它。我需要在加载 sails.io.js 脚本后插入它。

有没有办法有选择地加载脚本并仍然可以访问 assets.js()函数调用中自动包含的 sails.io.js ?对于这种情况,有没有更好的范例?

编辑:

自SailsJS 0.9发布以及资产管理系统重组以来,这个问题不再适用。

6 个答案:

答案 0 :(得分: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之前,并且在&lt;之前。脚本&gt;在页面上。

看起来你的admin.js期待sails.io尚未设置的条件,也许它正在协商与服务器的传输?尝试等待设置条件。

答案 1 :(得分:1)

  
    

在Sails.js应用程序中,如何有选择地包含javascript资源?

  

我使用assets.js()的包装选择性地加载js资产。这段代码使用了Jade的“ - ”和“!{...}”。 EJS将使用“&lt;%...%&gt;”和“&lt;%= ...%&gt;”

<!-- 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将是mixins的特例。

答案 2 :(得分:1)

我知道这是一个老问题,但因为人们仍然在寻找这个问题。

在创建新项目后,Sails在根目录中有一个名为tasks的文件夹。

您要查找的文件是

  

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'
];

在sails.io.js之前放置你想要加载的脚本。

这与帆0.11.x

相关

另一种有效的方法是创建一个views / partials文件夹

并创建一个像mapScripts.ejs这样的新文件 删除脚本标记并在视图中使用

<% include ../partials/mapScripts %>

答案 3 :(得分:0)

是的,你在模板中加了一个条件。 :)

或为你的js添加另一个“块”。

extends ../layout

block body
    <h1>hello</h1>

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

答案 4 :(得分:0)

回答有关包含文件所在位置的部分问题。

在0.10版本中,文件的顺序在文件tasks/values/injectedFiles.js中设置,我在之前的版本中回忆起它是在Gruntfile.js本身确定的。

答案 5 :(得分:0)

您可以在tasks / pipeline.js

中添加自定义文件的引用
var jsFilesToInject = [
  'js/dependencies/sails.io.js',
  'js/dependencies/**/*.js',
  'js/**/*.js',
  'js/yourcustomFile.js'
];