Javascript 如何将bower组件与sails.js连接?
我希望能够通过bower安装Javascript依赖项,并在应用程序中使用它们,但我想不出一种方法,只需将粘贴文件从Javascript 如何将bower组件与sails.js连接?,javascript,dependency-management,bower,sails.js,Javascript,Dependency Management,Bower,Sails.js,我希望能够通过bower安装Javascript依赖项,并在应用程序中使用它们,但我想不出一种方法,只需将粘贴文件从bower\u components文件夹复制到Sails资产文件夹 /* * Create a file called .bowerrc and put the following in it. * This file should be in the root directory of the sails app. */ { "directory": "asse
bower\u components
文件夹复制到Sails资产文件夹
/*
* 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"
}
理想情况下,我想我应该使用
requirejs
并指向main.js
文件中的bower组件。我可能想把一个方形的钉子钉在一个圆孔里,如果是的话,请告诉我。欢迎使用Sails管理组件/库的任何想法。注意:以下答案与当前版本的SailsJS不再完全相关,因为自SailsJS 0.10起,不支持链接器文件夹
见:
原始答案:
我找到了一个解决方案,其实很简单。我没有意识到您可以配置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与sail一起使用的一个技巧。默认情况下,您将从socket.io文件中得到一个错误,因为sails将在不使用requirejs的情况下加载它。这将抛出一个错误,因为socket.io支持amd样式加载,更多详细信息请参见此处
解决此问题的最简单方法是注释掉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模块。很抱歉我迟到了
我认为在linker中包含bower_组件是个坏主意,因为当你扬帆时,其中的所有内容都会被复制到.tmp和include-in标记中。
例如,如果您使用bower包含Angular,那么脚本中将包含两个内容:一个用于Angular.js,另一个用于Angular.min.js。两者兼而有之是错误的
以下是我的项目解决方案:
- 我已在根目录中创建了一个文件夹bower_组件
- 我已经在copy:dev中的数组文件的Gruntfile.js中添加了这一行
{.tmp/public/linker/js/angular.js':'./bower_components/angular/angular.js'}
对于我想要包含的每个文件,我需要在这个数组中手动添加一个新行。我还没有找到另一个自动解决方案。如果有人找到更好的解决方案……;) 在Sails 0.10中,“assets/linker”目录不再存在,但是我发现了一个简单解决方案的线索,该解决方案使bower->asset linker工作流实现了一定程度的自动化,同时还允许对最终链接的内容进行精确控制
解决方案是添加到Sails.jscompileasets任务中
grunt.registerTask('compileAssets', [
'clean:dev',
'bower:dev',
'jst:dev',
'less:dev',
'copy:dev',
'coffee:dev'
]);
然后像这样配置grunt bower任务(如tasks/config/bower.js):
这将自动将您的bower js和css文件复制到适当的位置,以便Sail的资产链接器查找并自动添加到项目的布局模板中。任何其他js或css文件仍将自动添加到您的bower文件之后
然而,这仍然不是一个灵丹妙药,因为此设置有两大警告:
1-通过bower grunt添加的文件必须在bower.json的main数组中列出。如果您看到未加载预期的文件,则必须编辑该packages bower.json文件或通过grunt bower的packagesspecific选项手动添加依赖项
2-资产链接器中bower文件的顺序目前按字母顺序排列。到目前为止,我唯一能调整这种顺序的方法是在Sail的编译集任务的其余部分之前,再进行一个额外的grunt任务,手动重新排序文件。不过这一次我相信grunt bower可以做些什么。连接帆船和bower的方法不止一种
通过自定义生成器集成Bower的SailsJS包存在于此处:
也有一种方法可供吞咽。我发现实现这一点的最简单方法就是将单个Bower组件添加到您的任务/pipeline.js
文件中。例如,以下是添加Modernizer的方法:
//要按顺序注入的客户端javascript文件
//(使用Grunt样式的通配符/glob/splat表达式)
变量jsFilesToInject=[
//在加载sails.io之前,先加载其他内容
'js/dependencies/sails.io.js',
//这里引入了jQuery或Angular之类的依赖项
'js/dependencies/***.js',
// =========================================================
//现代化:
'bower_components/Modernizer/Modernizer.js',
// =========================================================
//所有其他客户端js文件
//不会按特定顺序在这里注射。
“js/***.js”
];
指向bower\u components/modernizer/modernizer.js
的链接会插入布局模板中的
占位符中,它也会缩小,等等。当您运行sails lift--prod
来管理脚本的顺序时,只需在var jsFilesToInject=[]处编辑tasks/pipeline.js
在grunt bower的版本0.15.1
之前,它一直工作得很好。有些东西发生了变化,阻止了bower_组件被复制。我认为现在必须修复它,因为从今天起,grunt bower 0.16.0对我起作用。这里强烈建议不要使用仅链接的答案,因为链接将来可能会失效。我建议你用你引用的资料编辑你的答案。这个答案现在是