我希望能够通过bower安装 Javascript 依赖项并在sails.js应用程序中使用它们,但我无法找到一种方法来执行此操作,而只需将文件夹中的粘贴文件复制bower_components
到Sails资产文件夹.
理想情况下,我想我想使用requirejs
并指向文件中的凉亭组件main.js
。我可能想在圆孔中敲击方钉,如果是,请告诉我。components/libraries
欢迎任何关于使用 Sails 进行管理的想法。
我希望能够通过bower安装 Javascript 依赖项并在sails.js应用程序中使用它们,但我无法找到一种方法来执行此操作,而只需将文件夹中的粘贴文件复制bower_components
到Sails资产文件夹.
理想情况下,我想我想使用requirejs
并指向文件中的凉亭组件main.js
。我可能想在圆孔中敲击方钉,如果是,请告诉我。components/libraries
欢迎任何关于使用 Sails 进行管理的想法。
在 Sails 0.10 中,“assets/linker”目录不再存在,但是我发现了一个简单的解决方案,它为 bower -> 资产链接器工作流程提供了一些自动化,同时还允许对最终链接的内容进行一些细粒度的控制。
解决方案是将grunt-bower添加到 Sails.js compileAssets任务中
grunt.registerTask('compileAssets', [
'clean:dev',
'bower:dev',
'jst:dev',
'less:dev',
'copy:dev',
'coffee:dev'
]);
然后像这样配置你的 grunt-bower 任务(作为tasks/config/bower.js):
module.exports = function(grunt) {
grunt.config.set('bower', {
dev: {
dest: '.tmp/public',
js_dest: '.tmp/public/js',
css_dest: '.tmp/public/styles'
}
});
grunt.loadNpmTasks('grunt-bower');
};
这将自动将您的 bower js 和 css 文件复制到适当的位置,以便 Sail 的资产链接器找到并自动添加到项目的布局模板中。任何其他 js 或 css 文件仍将自动添加到您的 bower 文件之后。
然而,这仍然不是灵丹妙药,因为这个设置有两个重要的警告:
1 - 通过 bower-grunt 添加的文件必须列在 bower.json 的主数组中。如果你看到一个文件没有被加载,你必须编辑那个包 bower.json 文件,或者通过 grunt-bower 的packageSpecific选项手动添加依赖项。
2 - 资产链接器中的 bower 文件的顺序目前是按字母顺序排列的。到目前为止,我调整这个顺序的唯一办法是修补一个额外的 grunt 任务,在 Sail 的compileAssets任务的其余部分之前手动重新排序文件。但是,我相信 grunt-bower 可以通过支持 package copy ordering来做一些事情。
注意:以下答案不再与当前版本的 SailsJS 完全相关,因为从 SailsJS 0.10 开始不支持链接器文件夹。
请参阅:Sails 未生成链接器
原答案:
我能够为此找到一个解决方案,这实际上非常简单。我没有意识到您可以配置 bower 放置文件的位置。
创建一个 .bowerrc 文件并更改安装 bower 组件的目录,对于 Sailjs,它们应该放在 assets 文件夹中。
/*
* Create a file called .bowerrc and put the following in it.
* This file should be in the root directory of the sails app.
*/
{
"directory": "assets/linker/bower_components"
}
然后,每当文件更改时,Sails 将使用 grunt 将它们复制到 .tmp/public/assets 文件夹。如果您不希望sails 不断删除然后重新复制这些文件,您可以将它们排除在grunt 文件中。
/*
* This is not necessary, but if you have a lot of components and don't want
* them constantly being deleted and copied at every file change you can update
* your Gruntfile.js with the below.
*/
clean: {
dev: ['.tmp/public/**',
'!.tmp/public',
'!.tmp/public/bower_components/**'],
build: ['www']
},
将 requirejs 与帆一起使用的一个技巧。默认情况下,你会从 socket.io 文件中得到一个错误,因为sails 会在不使用 requirejs 的情况下加载它。这会抛出一个错误,因为 socket.io 支持 amd 样式加载,更多细节在这里http://requirejs.org/docs/errors.html#mismatch。
解决此问题的最简单方法是仅注释掉 socket.io.js 末尾附近的行。
/*
* Comment the below out in the file assets/js/socket.io.js, if using requirejs
* and you don't want to modify the default sails setup or socket.io.
*/
if (typeof define === "function" && define.amd) {
define([], function () { return io; });
}
另一种方法是将assets/js中名为“socket.io.js”、“sails.io.js”和app.js的sails文件重新编码为amd模块。
我发现实现此目的的最简单方法是将各个 Bower 组件添加到您的tasks/pipeline.js
文件中。例如,以下是添加 Modernizr 的方法:
// 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',
// Dependencies like jQuery, or Angular are brought in here
'js/dependencies/**/*.js',
// =========================================================
// Modernizr:
'bower_components/modernizr/modernizr.js',
// =========================================================
// All of the rest of your client-side js files
// will be injected here in no particular order.
'js/**/*.js'
];
一个指向 then 的链接bower_components/modernizr/modernizr.js
会被插入到<!--SCRIPTS-->
布局模板的占位符中,并且当您运行sails lift --prod
.
对不起我迟到了。
我认为在链接器中包含 bower_components 是个坏主意,因为当您扬起帆时,其中的所有内容都将被复制到 .tmp 中并包含在标签中。例如,如果您在 bower 中包含 Angular,您的脚本中将包含两个内容:一个用于 angular.js,一个用于 angular.min.js。两者兼有是错误的。
这是我的项目解决方案:
我已经在我的 Gruntfile.js 中的 copy:dev 的数组文件中添加了这一行
{ '.tmp/public/linker/js/angular.js': './bower_components/angular/angular.js' }
对于我想要包含的每个文件,我需要在这个数组中手动添加一个新行。我还没有找到另一个自动解决方案。如果有人找到更好的解决方案... ;)
连接 SailsJS 和 Bower 的方法不止一种。
通过自定义生成器集成 Bower 的 SailsJS 包位于此处: https ://www.npmjs.com/package/sails-generate-bower
Gulp 也有一个。