У меня есть вопрос относительно наилучшей практики для включения node_modules
в HTML-сайт.
Представьте, что в моей node_modules
папке есть Bootstrap . Теперь для рабочей версии веб-сайта, как мне включить скрипт Bootstrap и CSS-файлы, расположенные внутри node_modules
папки? Есть ли смысл оставлять Bootstrap внутри этой папки и делать что-то вроде следующего?
<script src="./node_modules/bootstrap/dist/bootstrap.min.js"></script>
Или мне нужно добавить правила в мой файл gulp, которые затем скопируют эти файлы в мою папку dist? Или лучше было бы позволить gulp каким-то образом полностью удалить локальный загрузчик из моего HTML-файла и заменить его версией CDN?
Ответы:
Обычно вы не хотите раскрывать свои внутренние пути для того, как ваш сервер структурирован с внешним миром. Что вы можете сделать, так это создать
/scripts
статический маршрут на вашем сервере, который выбирает его файлы из любого каталога, в котором они находятся. Так что, если ваши файлы находятся в"./node_modules/bootstrap/dist/"
. Затем тег script на ваших страницах выглядит так:Если вы использовали экспресс с nodejs, статический маршрут так же прост:
Затем любые запросы браузера
/scripts/xxx.js
автоматически будут получены из вашегоdist
каталога по адресу__dirname + /node_modules/bootstrap/dist/xxx.js
.Примечание: более новые версии NPM помещают больше вещей на верхний уровень, не вкладываясь так глубоко, поэтому, если вы используете более новую версию NPM, имена путей будут отличаться от указанных в вопросе OP и в текущем ответе. Но концепция все та же. Вы узнаете, где файлы физически расположены на диске сервера и вы делаете
app.use()
с ,express.static()
чтобы сделать псевдо-путь к этим файлам , так что вы не подвергая фактический файл - сервер организации системы к клиенту.Если вы не хотите создавать статический маршрут, подобный этому, то вам, вероятно, лучше просто скопировать общедоступные сценарии в путь, который обрабатывает ваш веб-сервер,
/scripts
или в любое другое обозначение верхнего уровня, которое вы хотите использовать. Обычно вы можете сделать это копированием частью процесса сборки / развертывания.Если вы хотите сделать только один конкретный файл общедоступным в каталоге, а не все, что находится в этом каталоге, то вы можете вручную создать отдельные маршруты для каждого файла, а не использовать
express.static()
такие как:И код для создания маршрута для этого
Или, если вы все еще хотите разграничить маршруты для сценариев
/scripts
, вы можете сделать это:И код для создания маршрута для этого
источник
/scripts
потому что таким образом будут сохраняться любые зависимости внутри модуля.express.static()
отправляет первое найденное совпадение. Поскольку каждыйexpress.static()
оператор создает только один возможный совпадающий путь, не должно быть дубликатов из одногоexpress.static()
оператора. Если у вас есть несколькоexpress.static()
операторов, каждое из которых может иметь совпадение, то первое в вашем коде - это то, чье совпадение будет использовано. Кроме того, у вас не должно быть нескольких файлов с одинаковыми именами и относительным путем, доступных дляexpress.static()
операторов. Лучшая практика - не делать этого.express.static()
на каталог, содержащий ТОЛЬКО публичные файлы (включая подкаталоги). Так что я не могу представить проект, в котором былоdist
опубликовано много каталогов. Это кажется мне очень необычным. Возможно, вы хотите сделать определенный маршрут к конкретному файлу или 2-3 файлам. В этом случае вы несете ответственность за устранение неоднозначности этих файлов. Вscript.js
любом случае это не принесет вам пользы ./script.js
запрашивает браузер. Итак, абстрактный ответ заключается в том, что вы не должны допускать существования ситуации с дублирующимися именами файлов, потому что это не решаемая проблема, если вам не требуется уникальный префикс для каждого каталога файлов. Тогда повторяющиеся корневые имена не являются проблемой в любом случае. Чтобы получить более конкретный ответ с подробной рекомендацией, вам необходимо опубликовать свой вопрос с точными деталями.Я хотел бы использовать модуль path npm, а затем сделать что-то вроде этого:
ВАЖНО: мы используем path.join, чтобы соединять пути, используя независимый от системы способ, то есть в Windows и Unix у нас есть разные разделители пути (/ и)
источник
Как упомянуто jfriend00, вы не должны раскрывать структуру вашего сервера. Вы можете скопировать файлы зависимостей вашего проекта в нечто подобное
public/scripts
. Вы можете сделать это очень легко с помощью dep-linker :источник
src
s будут тогда чем-то вроде/scripts/[package-name]/dist/file.min.js
.Если вы хотите быстрое и простое решение (и у вас установлено gulp).
В моем случае
gulpfile.js
я запускаю простую задачу копирования и вставки, которая помещает любые файлы, которые могут мне понадобиться, в./public/modules/
каталог.Недостатком этого является то, что он не автоматизирован. Однако, если все, что вам нужно, это скопировать несколько сценариев и стилей (и сохранить их в списке), это должно сработать.
источник
'scripts': {'install':'yarn gulp copy-modules'}
, предполагая, что yarn является менеджером пакетов, а gulp установлен в пакет.Каталог 'node_modules' может отсутствовать в текущем каталоге, поэтому вы должны определить путь динамически.
источник
Я хочу обновить этот вопрос с более простым решением. Создайте символическую ссылку на node_modules.
Самый простой способ предоставить публичный доступ к node_modules - создать символическую ссылку, указывающую на ваши node_modules из вашего публичного каталога. Симлинк сделает так, как будто файлы существуют везде, где создана ссылка.
Например, если на сервере узла есть код для обслуживания статических файлов
и __dirname ссылается на / path / to / app, чтобы ваши статические файлы обслуживались из / path / to / app / dist
и node_modules находится в / path / to / app / node_modules, затем создайте символическую ссылку, подобную этой на mac / linux:
или как это на окнах:
Теперь запрос на получение:
получит ответ с файлом на
который действительно файл в
Если ваш каталог в / path / to / app / dist не является безопасным местом, возможно, из-за вмешательства процесса сборки с gulp или grunt, тогда вы можете добавить отдельный каталог для ссылки и добавить новый вызов serveStatic, такой как:
и в узле добавить:
источник
Я не нашел чистых решений (я не хочу раскрывать источник всех моих узлов node_modules), поэтому я просто написал скрипт Powershell для их копирования:
источник
Я сделал следующие изменения, чтобы автоматически включить файлы в индекс HTML. Таким образом, когда вы добавляете файл в папку, он автоматически выбирается из папки, без необходимости включать файл в index.html.
источник
Это то, что я настроил на моем
express
сервере:Удачи...
источник