Browsersync при удаленной разработке VM не будет работать в локальном браузере - PullRequest
0 голосов
/ 21 мая 2018

Большое вам спасибо за то, что нашли время проверить мою маленькую загадку.Это мой первый вопрос StackOverflow, поэтому, пожалуйста, прости меня, если я случайно пропущу что-то важное (я добавлю любую необходимую вам информацию, если вы просто дадите мне знать).

Моя проблема заключается в следующем: у меня естьВиртуальная личная виртуальная машина, которую я использую для размещения всего кода своего приложения, включая сервер приложения.Я использую PuTTY для подключения к своей виртуальной машине разработки и перенаправляю порт, на котором работает сервер приложений vert.x (т. Е. 7443), на мой локальный хост.Таким образом, когда я подключаюсь к серверу, я просто ввожу:

https://localhost:7443

в адресной строке браузера на моей локальной машине.Я также использую Gulp.js для создания компонента пользовательского интерфейса и отслеживания изменений в моих файлах.В настоящее время задача gulp watch просто перестраивает файлы комплектов Javascript и CSS, на которые я ссылаюсь в моем файле index.html, и я вручную перезагружаю браузер всякий раз, когда перестройки комплектов завершаются.Недавно я наткнулся на Browsersync, когда исследовал технологии live-reload для браузера, и он выглядит потрясающе, но я не могу заставить его работать с моими настройками разработки.

Вот мое задание gulp watch:

const browserSync = require("browser-sync").create("browser-sync-server");

gulp.task("watch", () => {
    console.info("=== Initializing BrowserSync Server ===");
    browserSync.init({
        proxy: "localhost:7443", // This is my dev server running on port 7443
        open: false // I do not want a new browser to open up when I start BrowserSync
    });

    console.info("=== Listening for changes to reload === ");
    const jsWatcher = gulp.watch(
        myJsFiles,
        { awaitWriteFinish: true },
        ["reload-js"]
    );
    const templateWatcher = gulp.watch(
        myHtmlFiles,
        { awaitWriteFinish: true },
        ["reload-templates"]
    );
    const lessWatcher = gulp.watch(
        myLessFiles,
        { awaitWriteFinish: true },
        ["reload-less"]
    );
});

Когда я запускаю задачу наблюдения, в консоли я вижу:

Starting 'watch'...
=== Initializing BrowserSync Server ===
=== Listening for changes to reload ===
Finished 'watch' after 126 ms
[Browsersync] Proxying: http://localhost:7443
[Browsersync] Access URLs:

       Local: http://localhost:3000
    External: http://192.168.1.11:3000

          UI: http://localhost:3001
 UI External: http://192.168.1.11:3001

Я также перенаправляю порты 3000 и 3001 на свой локальный компьютер, чтобы я мог получить доступ к этим конечным точкам в своем браузере.

Я могу нормально добраться до пользовательского интерфейса Browsersync через порт 3001 через HTTP, но когда я нажимаю кнопку «NEW TAB» в разделе Local , появляется новая вкладка, но сервер никогдагрузы.Он просто вращается и вращается, пока, наконец, я не получаю сообщение об ошибке в Chrome, которое говорит: «Данные не получены».У кого-нибудь есть идеи относительно того, в чем может быть проблема?Я предполагаю, что это как-то связано с тем фактом, что приложение моей команды использует HTTPS для доступа через браузер, и что для Browserync требуется дополнительная настройка для работы с HTTPS, но я не знаю, как это сделать.

Спасибо вам всем за помощь!Пожалуйста, дайте мне знать, если я смогу предоставить вам больше информации.

- Том

Редактировать 5/23/18:

Я использовал openssl для генерацииКлюч localhost и файлы сертификатов для моей виртуальной машины разработки и добавили их в мою конфигурацию для BrowserSync в моем gulpfile.js.

Вот моя измененная конфигурация:

const proxy = require("http-proxy-middleware");

...

browserSync.init({
  ui: {
    port: 8080
  },
  https: {
    key: "./conf/browsersync/localhost.key",
    cert: "./conf/browsersync/localhost.crt",
  },
  server: {
    baseDir: "./",
    index: "index.html"
  },
  middleware: [
    proxy("/api", {
      target: "https://localhost:7443",
      secure: false, // Do not validate SSL certs
      changeOrigin: true, // Seems to be a highly recommended setting
      xfwd: true,
      prependPath: true, // Ensure that the API calls are prepended with the target URL
      logLevel: "debug" // So that I can see verbose console output
    })
  ],
  port: 3000,
  open: false
});

Это определенно дало мнедальше, но это все еще не совсем верно.Теперь, когда я нажал https://localhost:3000 в своем браузере, я попал на главную страницу моего веб-приложения, но ни один из асинхронных вызовов API не был решен правильно.В консоли, где я запускаю задачу gulp watch, я вижу много ошибок от HPM (программное обеспечение html-proxy-middleware).Вот один пример:

[HPM] Error occurred while trying to proxy request /api/settings/ from localhost:3000 to https://localhost:7443 (ECONNRESET) (https://nodejs.org/api/errors.html#errors_common_system_errors)

Кроме того, если я открою консоль Javascript в окне браузера для https://localhost:3000 (сеанс BrowserSync), я могу увидеть множество ошибок 504 (время ожидания шлюза),Есть идеи?Еще раз большое спасибо за ваше время.

- Том

1 Ответ

0 голосов
/ 21 мая 2018

Прежде всего, я согласен, browsersync - это круто.

[Browsersync] Proxying: http://localhost:7443 Обратите внимание на http вместо https.Это не может работать.В своей строке proxy: "localhost:7443" вы ничего не говорите о протоколе.Попробуйте с префиксом https://.Скорее всего, вам также понадобится «secure: false» или подобное, если ваш сервер разработки использует самозаверяющий сертификат.Прокси-сервер должен будет принять этот сертификат, а не ваш браузер.

Если ваш бэкэнд также использует файлы cookie только для безопасности, вам придется использовать https на стороне браузера и на стороне клиента, иначе ваш браузер откажется отбезопасный cookie.Вот мой рабочий конфиг разработки (синтаксис Gruntfile), который делает это:

var proxy = require('http-proxy-middleware');
[...]
options: {
    port: 3000,
    server: {
        baseDir: './',
        index: '_index.html'
    },
    // redirect all calls to /api to the backend
    https: true,  // required for secure cookie to work
    middleware: [proxy('/api', {
        target: "https://external.backend.server",
        secure: false,  // required if server uses self-signed certificate
        changeOrigin: true,
        xfwd: true  // add X-Forwarded-* headers
    })],
    watchTask: true,
    logConnections: true,
    scrollRestoreTechnique: 'cookie',
    reloadDebounce: 500,
    ghostMode: false
}
...