【问题标题】:How can I include javascript assets selectively in SailsJS?如何在 SailsJS 中选择性地包含 javascript 资产?
【发布时间】:2013-07-09 20:27:23
【问题描述】:

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

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

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

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

编辑:

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

【问题讨论】:

    标签: javascript node.js express sails.js


    【解决方案1】:

    Sailsjs 使用asset-rack 来服务/assets。使用默认布局页面,sailsjs 提供的页面看起来像(dummy2.js 包含在显式的

    <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 尚未设置的条件,也许它正在与服务器协商传输?尝试等待设置条件。

    【讨论】:

    • 也许我使用的不是同一个版本的风帆。但默认布局页面在结束 body 标记之前包含sails.io.js。
    • 确实,sails.io 应该使用
    【解决方案2】:

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

    我使用 assets.js() 的包装器选择性地加载 js 资产。这个 sn-p 使用 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 是 mixins 的一个特例。

    【讨论】:

      【解决方案3】:

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

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

      你要找的文件是

      管道.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 之前。

      这与sails 0.11.x 相关

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

      并创建一个新文件,例如 mapScripts.ejs 将脚本标签放在那里并在您的视图中使用

      <% include ../partials/mapScripts %>
      

      【讨论】:

      • 如何在 html 文件中使用它?我只是在views文件夹下有app.html,当我像src="/js/bundle.js"这样使用它时它不起作用。
      • 你把javascript文件放到assets/js文件夹了吗?我假设您安装了最新的sails.js,因此如果您碰巧遵循旧教程,带有“--linker”的“sails new ”命令可能会弄乱正确提供的资产,不再需要它了使用标志。此外,它不是一个 html 文件,它是一个 .ejs 文件,也可能会弄乱配置。
      【解决方案4】:

      是的,您在模板中添加了条件。 :)

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

      extends ../layout
      
      block body
          <h1>hello</h1>
      
      block jsscripts
          <scripts> ..... </script>
      

      【讨论】:

      • 在管理模板中添加条件仍会导致脚本在sails.io.js 脚本之前加载。之后如何让它加载?我是否必须将 &lt;%- assets.js() %&gt; 行从 layout.ejs 移出到我的管理模板中?这将导致我必须对我的所有观点都做同样的事情。
      • 我不确定,但我认为 socketio 首先加载。也许你可以添加一个监听器来检查 socketio 是否已经加载。
      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        您可以在 tasks/pipeline.js 中添加自定义文件的引用

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-14
          • 1970-01-01
          • 2015-09-04
          相关资源
          最近更新 更多