Подтвердить что ты не робот

Настроить node express для обслуживания статических параметров bower_components?

У меня есть структура каталогов

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

Я хотел бы запустить приложение и выполнить index.html с помощью node. Итак, в 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?

4b9b3361

Ответ 1

Я использую эту настройку:

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>

Ответ 2

Вы должны использовать

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.

Без использования, вы обычно делаете ожидания относительно начала и конец патчей соединился, зная, что у них нет ни одной косой черты.

Ответ 3

Bower можно настроить с помощью JSON в файле .bowerrc.

Добавьте файл .bowerrc со следующим содержимым в корне вашего проекта с содержимым.

{
  "directory": "public/bower_components"
}

Это приведет к тому, что компоненты балансировки, на которые вы ссылаетесь, находятся в правильной библиотеке, и вам не понадобится статический каталог extract в выражении.

Ответ 4

Измените структуру каталогов на:

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 несколько раз для выражения)
Добавьте в app 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);
});

И в этом случае структура вашего каталога остается прежней. Надеюсь, что это поможет.
Счастливое кодирование..:)

Ответ 5

Я использую:

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

И мой app.js имеет это определение bower_components как статический путь:

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

В моем шаблоне Jade я ссылаюсь на jquery и bootstrap следующим образом:

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).

Надеюсь, это поможет кому-то.

Ответ 6

Имела ту же проблему после перемещения 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')))

что является правильным путем в моем случае.

Ответ 7

Это также работает для меня:

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

Убедитесь, что у вас есть reset ваш локальный сервер или убедитесь, что вы используете nodemon для просмотра ваших изменений!