Как настроить сервер разработки Webpack для обслуживания определенной папки при запуске остальной части сайта через другой сервер?

Некоторый быстрый фон:

Сайт моей компании работает с CMS, а CMS обрабатывает всю маршрутизацию. Нет HTML-файлов, только бритвенные файлы (.cshtml). Хотя я предпочитаю делать сайт заново, это не вариант, поэтому я стараюсь постепенно модернизировать сайт, интегрируя vue.js с частичным рабочим процессом разработки веб-пакетов на страницу за страницей. основа.

Я потратил много времени на настройку веб-пакета таким образом, чтобы он мог обрабатывать файлы, находящиеся только в папке / dist /, - все остальное подается через http://my.server/ и обрабатывается CMS и бэкэндом.

Методом проб и ошибок мне удалось получить файлы, обслуживающие webpack-dev-server, в папке / dist /, в то же время позволяя остальной части сервера обслуживать все остальное (через http://my.server/). К сожалению, это ТОЛЬКО работает, когда пути к файлам для части webpack-dev-server специально ссылаются на " http://localhost:8080/", что явно недопустимо.

Код среды разработки должен точно соответствовать коду производственной среды, поэтому <script src="http://localhost:8080/dist/build.js"></script> это просто недопустимо.

Однако, если я просто напишу <script src="/dist/build.js"></script> сервер разрешает это <script src="http://my.server/dist/build.js"></script> что, очевидно, неверно и приводит к 404 (потому что эти файлы обслуживаются только с сервера разработки).

У меня вопрос: как мне настроить webpack-dev-server на то, чтобы он обслуживал все содержимое папки / dist / из себя, а все остальное на сайте можно было обслуживать через " http://my.server/"?

Вот мой файл webpack.config.js для справки:

var path = require('path')
var webpack = require('webpack')

module.exports = {
  entry: './src/main.js',
  output: {
    path: path.resolve(__dirname, './dist'),
    publicPath: '/dist/',
    filename: 'build.js'
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: {
          loaders: {
            // Since sass-loader (weirdly) has SCSS as its default parse mode, we map
            // the "scss" and "sass" values for the lang attribute to the right configs here.
            // other preprocessors should work out of the box, no loader config like this nessessary.
            'scss': 'vue-style-loader!css-loader!sass-loader',
            'sass': 'vue-style-loader!css-loader!sass-loader?indentedSyntax'
          }
          // other vue-loader options go here
        }
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/
      },
      {
        test: /\.(png|jpg|gif|svg)$/,
        loader: 'file-loader',
        options: {
          name: '[name].[ext]?[hash]'
        }
      }
    ]
  },
  resolve: {
    alias: {
      'vue$': 'vue/dist/vue.common.js'
    }
  },
  devServer: {
    publicPath: '/dist/',
    historyApiFallback: true,
    noInfo: false,
    proxy: [{
      context: function(pathname, req) {
        // exclude /src/ and /dist/
        return !pathname.match("^/(src|dist)/");
      },
      target: {
        "host": "my.server",
        "protocol": 'http:',
        "port": 80
      },
      ignorePath: false,
      changeOrigin: true,
      secure: false
    }]
  },
  performance: {
    hints: false
  },
  devtool: '#eval-source-map'
}

if (process.env.NODE_ENV === 'production') {
  module.exports.devtool = '#source-map'
  // http://vue-loader.vuejs.org/en/workflow/production.html
  module.exports.plugins = (module.exports.plugins || []).concat([
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: '"production"'
      }
    }),
    new webpack.optimize.UglifyJsPlugin({
      sourceMap: true,
      compress: {
        warnings: false
      }
    }),
    new webpack.LoaderOptionsPlugin({
      minimize: true
    })
  ])
}

Хотя, вероятно, нет необходимости отвечать на этот вопрос, если вы хотите получить дополнительную информацию, моя первоначальная проблема (и решение этой проблемы) находятся здесь: Используя простую настройку vue.js / webpack, как настроить сервер dev для прокси всего За исключением нескольких файлов.js и.vue?

3 ответа

В основном это работает с приложением.NET. Он по-прежнему обслуживает файлы разработчиков из localhost:8080 но позаботится о том, чтобы модифицировать файлы шаблонов для вас во время разработки и настроить их обратно для производства. Не уверен, решит ли это вашу проблему полностью, но это работает для нас, и пока может помочь другим, поэтому я все равно оставлю это здесь.

В package.json У меня есть скрипт start (dev) и build (prod):

"start": "webpack --config webpack.dev.js && webpack-dev-server --config webpack.dev.js",
"build": "webpack --config webpack.prod.js"

webpack.prod.js просто устанавливает mode: "production" и сливается с webpack.config.js которая выполняет большую часть работы с веб-пакетами, включая внедрение файлов в.net _Layout_React.cshtml файл, включая сценарии производства из Scripts папка:

const HtmlWebPackPlugin = require('html-webpack-plugin');
const webpack = require('webpack');
const path = require('path');

module.exports = {
  entry: {
    main: './src/index.js',
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
        },
      },
      {
        test: /\.html$/,
        use: [
          {
            loader: 'html-loader',
          },
        ],
      },
      {
        test: /\.scss$/,
        use: [
          'style-loader', // creates style nodes from JS strings
          'css-loader', // translates CSS into CommonJS
          'sass-loader', // compiles Sass to CSS, using Node Sass by default
        ],
      },
    ],
  },
  plugins: [
    new HtmlWebPackPlugin({
      template: '../../../Views/Shared/_Layout_Template.cshtml',
      filename: '../../Views/Shared/_Layout_React.cshtml',
    }),
    new webpack.HashedModuleIdsPlugin(),
  ],
  output: {
    path: path.resolve(__dirname, '../../../Scripts/React/'),
    publicPath: '/Scripts/React/',
    filename: '[name].[contenthash].production.js',
  },
  optimization: {
    runtimeChunk: 'single',
    splitChunks: {
      cacheGroups: {
        vendor: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendor',
          chunks: 'all',
        },
      },
    },
  },
};

Когда я бегу npm run build это строит производство _Layout_React.cshtml Шаблон, который используется в приложении и включает в себя файлы из файловой системы. Тем не менее, когда я бегу npm start это меняет _Layout_React.cshtml шаблон для включения файлов из localhost:8080 где webpack-dev-server работает и обслуживает просматриваемые файлы из:

webpack.dev.js:

const merge = require('webpack-merge');
const HtmlWebPackPlugin = require("html-webpack-plugin");
const webpack = require('webpack');
const baseConfig = require('./webpack.config.js');

module.exports = merge(baseConfig, {
    mode: "development",
    devtool: 'eval-source-map',
    devServer: {
        open: false,
    },
    output: {
        filename: '[name].development.js',
        publicPath: 'http://localhost:8080/dist/',
    },
});

Теперь, когда я бегу npm start затем запустите приложение.NET, я получу приложение.NET на localhost:33401 но он получает это реагировать файлы из localhost:8080 и автоматически компилировать их при сохранении, и когда пришло время нажать на репо, я запускаю npm run build и он встраивает файлы в жесткие файлы в.NET Scripts папку и обновляет шаблон, чтобы отразить это.

Измените publicPath: '/dist/' в конфигурации веб-пакета, чтобы он соответствовал вашему фактическому пути к продукту, а затем измените сценарий SRC в index.html, чтобы он указывал на новый открытый путь... т.е. в основном виртуальный путь... Не обязательно присутствовать на реальной файловой системе.. я добился того же в моем проекте..

Думаю, что проблема вызвана использованием этого хоста: http://my.server вместо по умолчанию http://localhost:8080

Попробуйте запустить webpack-dev-server с флагом --host 0.0.0.0 а также --port 80

`--host <hostname/ip>`: hostname or IP. `0.0.0.0` binds to all hosts.

https://webpack.github.io/docs/webpack-dev-server.html

Другие вопросы по тегам