配置节点快递服务静态bower_components?


71

我有一个目录结构

projectName
    | - bower_components/
    | - public/
        | - css
        | - js
        | - index.html
    | - Gruntfile.js
    | - package.json
    | - bower.json
    | - app.js

我想启动我的应用程序并index.html与节点一起使用。所以app.js我有:

var express = require('express');
var port = process.env.PORT || 3000;
var app = express();

app.configure(function(){
    // Serve up content from public directory
    app.use(express.static(__dirname + '/public'));
    app.use(app.router);
    app.use(express.logger()); 
});

app.listen(port, function(){
    console.log('Express server listening on port ' + port);
});

在底部,index.html我有:

<script src="../bower_components/jquery/jquery.js"></script>
<script src="../bower_components/d3/d3.js"></script>
<script src="../bower_components/bootstrap/dist/js/bootstrap.js"></script>
<script src="bower_components/spin.js/spin.js"></script>
<script src="bower_components/mustache/mustache.js"></script>

当我启动服务器时,index.html出现但以上库均未加载。我收到错误消息(404):

GET http://localhost:3000/bower_components/jquery/jquery.js 404 (Not Found) localhost/:32
GET http://localhost:3000/bower_components/d3/d3.js 404 (Not Found) localhost/:33
GET http://localhost:3000/bower_components/bootstrap/dist/js/bootstrap.js 404 (Not Found) localhost/:34
GET http://localhost:3000/bower_components/spin.js/spin.js 404 (Not Found) localhost/:35
GET http://localhost:3000/bower_components/mustache/mustache.js 404 (Not Found) 

如何提供bower_components中的文件?


另见我类似的问题(回答),也许它可以帮助:stackoverflow.com/questions/23933621/...
格林

我有个问题。是否package.jsonbower.json与对方发生冲突?对于名称,版本等字段,甚至可能依赖于具有不同版本的相同软件包的依赖项。你在package.json中放了什么,在bower.json中放了什么?
Nam Thai

package.json用于npm依赖项(很多时候是服务器端或构建系统要求),其中bower.json仅用于客户端依赖项,例如引导程序,角度或jquery。他们不会互相冲突
Connor Leech 2015年

Answers:


194

我使用以下设置:

app.use(express.static(__dirname + '/public'));
app.use('/bower_components',  express.static(__dirname + '/bower_components'));

因此,任何Bower组件都是从HTML加载的,如下所示:

<script src="/bower_components/..."></script>

以及其他所有客户端JS / CSS(在中public/)的加载方式如下:

<script src="/js/..."></script>

我发现,为什么它不工作stackoverflow.com/questions/23933621/...
格林

12
答案现在应该使用path.join(__ dirname,'/ bower_components')
Warren

我用Yeoman生成引导程序和表达。我必须添加app.use('/bower_components', express.static(config.root + '/bower_components'));到/config/express.js文件。注意config.root而不是__dirname
kingdango

我有个问题。上述项目同时具有package.jsonbower.json。那些彼此冲突吗?对于名称,版本等字段,甚至可能依赖于具有不同版本的相同软件包的依赖项。在package.json中应该是什么,在bower.json中应该是什么?
Nam Thai

一般来说,@ NickyThaibower.json用于客户端依赖性,package.json用于服务器端依赖性。
罗伯特克莱普(Robertklep),2015年

8

你应该用

app.use(express.static(path.join(__dirname, '/public')));
app.use('/bower_components',  express.static( path.join(__dirname, '/bower_components')));

请注意(path.join)的用法与@robertklep答案不同

这是来自另一个SO问题的注释,根据我的理解,它非常好

path.join将处理不必要的定界符,如果给定的路径来自未知来源(例如,用户输入,第三方API等),则可能会发生不必要的定界符。

所以path.join('a /','b')path.join('a /','/ b'),path.join('a','b')和path.join('a', '/ b')都将给出a / b。

如果不使用它,您通常会期望所加入路径的起点和终点,因为它们只有一个斜线或一个斜线。


1
path.join不应包含与+运算符的串联,而应,改为逗号
Warlock

我已经尝试了+和,但是在Windows系统上不起作用。但是我只能通过相同的过程使用其他文件夹中的资产文件,但不能与“ bower_components”文件夹一起使用。帮我解决。
2016年

@robertklep为什么我们需要对bower_components执行此操作,而对于其他目录(如CSS js img)则不需要?我找不到任何文档
-TSR

6

可以在.bowerrc文件中使用JSON配置Bower 。

.bowerrc具有内容的项目的根目录中添加具有以下内容的文件。

{
  "directory": "public/bower_components"
}

这会将您所引用的Bower组件放置在正确的库中,并且您无需在express中提取静态目录。


1

将目录结构更改为:

projectName

    | - public/
        | - bower_components/
        | - css
        | - js
        | - index.html
    | - Gruntfile.js
    | - package.json
    | - bower.json
    | - app.js

index.html进行以下更改:

<script src="../public/bower_components/jquery/jquery.js"></script>
<script src="../public/bower_components/d3/d3.js"></script>
<script src="../public/bower_components/bootstrap/dist/js/bootstrap.js"></script>
<script src="public/bower_components/spin.js/spin.js"></script>
<script src="public/bower_components/mustache/mustache.js"></script>


或另一种方法是将bower_components文件夹拆分为静态内容。(您可以static middleware多次注入以进行表达)
在应用congfig中添加以下内容进行表达。然后,您的配置代码如下所示:

var express = require('express');
var port = process.env.PORT || 3000;
var app = express();

app.configure(function(){
    // Serve up content from public directory
    app.use(express.static(__dirname + '/public'));
    app.use(express.static(__dirname + '/bower_components'));
    app.use(app.router);
    app.use(express.logger()); 
});

app.listen(port, function(){
    console.log('Express server listening on port ' + port);
});

在这种情况下,您的目录结构保持不变。希望这可以帮助。
快乐的编码.. :)


2
我的直觉告诉我,这是不赞成的,因为如果您将bower_components目录手动移到另一个目录下,则会失去包管理器的某些功能。
webkenny 2015年

2
您可以使用文件将bower配置为将其bower_components文件夹放置在public文件夹中.bowerrc,如本示例中的express和grunt所示。如果我使用的是Grunt,我想在我的Gruntfile中配置服务器的静态文件目录,而我不知道该如何grunt-express使用。因此,我的解决方案是仅移动文件夹。
Matthias 2015年

1
我差点把你的回答当做下意识的反应。我以为移动bower_components文件夹是一种反模式。但是我想不出有什么好的理由反对它,而且它看起来像是一个简单的解决方案。
Matthias 2015年

0

我正在使用:

$ npm -version && node -v
2.11.3
v0.12.7

我的app.js定义bower_components是静态路径:

app.use(express.static(path.join(__dirname, 'bower_components')));

在我玉模板中,我引用jquerybootstrap像这样:

doctype html
html
    head
        title= title
        link(href='bootstrap/dist/css/bootstrap.min.css', rel='stylesheet')
        link(href='bootstrap/dist/css/bootstrap-theme.min.css', rel='stylesheet')
    body
        block content

    script(type='text/javascript', src='jquery/dist/jquery.js')
    script(type='text/javascript', src='bootstrap/dist/js/bootstrap.js')

我正在运行Windows 7(x64)。

希望这对某人有帮助。


0

将bower_components移动到另一个文件夹后,出现了相同的问题。这有助于我了解发生了什么。该文档非常有用:https : //github.com/expressjs/serve-static

然后将这段代码放到我的node / express app.js文件中:

console.log('DIRNAME:', __dirname, 'JOINED:', path.join(__dirname, '../../bower_components'));

这是来自index.html

<script src="/bower_components/jquery/dist/jquery.js"></script>
<script src="/bower_components/angular/angular.js"></script>

并在app.js中

app.use('/bower_components', express.static(path.join(__dirname, '../../bower_components')))

就我而言,这是一条正确的道路。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.