在Sails.js应用程序中,如何有选择地包含javascript资源?
例如,如果我有一个管理页面,admin.js位于assets / js目录中。如何在公共索引页面上加载admin.js?
我知道我可以将js移到公共目录,并将脚本包含在我的管理视图模板中。但是在 assets.js()调用插入javascript之后,我仍然无法包含它。我需要在加载 sails.io.js 脚本后插入它。
有没有办法有选择地加载脚本并仍然可以访问 assets.js()函数调用中自动包含的 sails.io.js ?对于这种情况,有没有更好的范例?
编辑:
自SailsJS 0.9发布以及资产管理系统重组以来,这个问题不再适用。
答案 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'
];