7

一些快速背景:

我公司的网站运行一个 CMS,CMS 处理所有路由。没有 html 文件,只有 razor 文件 (.cshtml)。虽然从头开始重做网站是我更愿意做的事情,但这不是一个选择,所以我试图通过将 vue.js 与 webpack 开发工作流逐页集成来慢慢地使网站现代化基础。

我花了相当多的时间设置 webpack 以允许它只处理在 /dist/ 文件夹中找到的文件 - 其他所有内容都通过http://my.server/ 提供并由 CMS 和后端处理。

通过反复试验,我设法在 /dist/ 文件夹中获取 webpack-dev-server 服务文件,同时允许服务器的其余部分提供其他所有服务(通过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 设置,如何配置开发服务器以代理所有内容除了一些 .js 和 .vue 文件?

4

3 回答 3

2

我大部分时间都在使用 .NET 应用程序。它仍然提供开发文件,localhost:8080但会在开发期间为您修改模板文件并将它们调整回生产环境。不确定它是否会以这种方式完全解决您的问题,但它现在对我们有用,并且可能会帮助其他人,所以无论如何我都会把它留在这里。

package.json我有一个开始(开发)和构建(产品)脚本:

"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大部分 webpack 的东西,包括将文件注入 .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并在保存时自动编译它们,以及何时推送到我运行的 reponpm run build并将文件构建成硬文件在 .NETScripts文件夹中并更新模板以反映这一点。

于 2018-10-10T12:54:48.567 回答
0

更改 webpack 配置的 publicPath: '/dist/' 以匹配您的实际产品路径,然后将 index.html 中的脚本 SRC 更改为指向新的公共路径..即基本上是虚拟路径...不一定需要存在在实际的文件系统上..我在我的项目中实现了同样的目标..

于 2017-02-03T04:19:30.007 回答
0

认为问题是由使用此主机引起的: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#webpack-dev-server-cli

于 2017-02-03T10:03:52.593 回答