【问题标题】:How do you use inline mode with the webpack-dev-server API and Gulp如何通过 webpack-dev-server API 和 Gulp 使用内联模式
【发布时间】:2015-01-08 15:49:12
【问题描述】:

我一直在使用带有--inline--host 标志的webpack-dev-server。这一切都很好。

webpack-dev-server --inline --host example.com

然后我考虑使用 gulp 和 webpack-dev-server API 来完成这项任务。

var gulp             = require('gulp');
var gutil            = require('gulp-util');
var Webpack          = require('webpack');
var WebpackDevServer = require('webpack-dev-server');
var WebpackConfig    = require('./webpack.config.js');

gulp.task('default', ['webpack-dev-server']);

gulp.task('webpack-dev-server', function(callback) {
  new WebpackDevServer(Webpack(WebpackConfig), {
    host: 'example.com',
    inline: true,
    publicPath: WebpackConfig.output.publicPath,
  }).listen(port, host, function(err) {
    if(err) throw new gutil.PluginError('webpack-dev-server', err);
    gutil.log('[webpack-dev-server]', 'http://example.com:8080');
  }); 
});

这似乎不起作用,我相信API没有inlinehost

知道这是否可能吗?

【问题讨论】:

    标签: javascript gulp webpack


    【解决方案1】:

    在当前的 Webpack 版本 (1.13.2) 中可以做到这一点。

    来自documentation

    要使用内联模式,要么

    在命令行中指定--inline
    在您的webpack.config.js 中指定devServer: { inline: true }

    【讨论】:

    • 我从来没有设法让它工作,文档仍然说服务器对 webpack.config.js 一无所知......
    【解决方案2】:

    不能通过传递给服务器的选项中的标志来启用内联选项。但是,通过查看command line script,您可以看到它只是将额外的入口脚本附加到传递给 webpack 编译器的选项中。

    你可以在你的代码中重复同样的事情。

    WebpackConfig.entry = [
       WebPackConfig.entry, // assuming you have a single existing entry
       require.resolve("webpack-dev-server/client/") + '?http://localhost:9090',
       'webpack/hot/dev-server'
    ]
    

    【讨论】:

      【解决方案3】:

      使用 API 方式创建 webpack-dev-server 时 inline 选项不可用,需要手动定义

      webpack-dev-server/client?http://<path>:<port>/
      

      到(所有)入口点。原因是 webpack-dev-server 模块 无权访问 webpack 配置。 https://webpack.github.io/docs/webpack-dev-server.html#inline-mode-with-node-js-api

      【讨论】:

        【解决方案4】:

        似乎答案已经过时了,我没有设法通过 gulp 使用它们中的任何一个来添加 inline,所以我打开了 webpack-dev-server.js 并将执行该操作的方法复制到我的 gulp 文件中并对其进行了修改一点点。它有效(即使它有点讨厌):

        function addInline(config, hot) {
            var devClient = [require.resolve("webpack-dev-server/client/") + "?http://localhost:8080"];
        
            if (hot) {
                devClient.push("webpack/hot/dev-server");
            }
            [].concat(config).forEach(function (config) {
                if (typeof config.entry === "object" && !Array.isArray(config.entry)) {
                    Object.keys(config.entry).forEach(function (key) {
                        config.entry[key] = devClient.concat(config.entry[key]);
                    });
                } else {
                    config.entry = devClient.concat(config.entry);
                }
            });
        }
        

        在将配置传递给 webpack 之前,您需要在其中传递配置:

        var webpackDevelopmentConfig = require('./Source/config/webpack.config.development.js');
        addInline(webpackDevelopmentConfig)
        
        var compiler = webpack(webpackDevelopmentConfig);
        

        【讨论】:

          【解决方案5】:

          默认启用内联模式 - 转到http://host:port/webpack-dev-server/

          【讨论】:

          • 也许我误解了内联模式实际上是什么,但我认为它暗示了非 iframed 模式。从host:port/webpack-dev-server 服务是我试图避免的,因为它会导致布局问题。
          • 我认为我错了,你是对的。你想要的不是 host:port/?默认情况下,您可以在非 iframed 模式下访问那里的文件。
          • 你可能确实是对的。该文档有点令人困惑,因为它似乎首先提到了隐含的内联模式,然后是显式的模式。不幸的是,设置host 对我也很有用。我想我需要深入研究一下代码。
          • @Hugh,你想出来了吗,我也在想办法。
          • @Hugh,我实际上最终正确配置了我的服务器,但我不知道具体是哪件事导致它工作。因此,网址/webpack-dev-server/ 只是一个 iframe,其目标是同一主机上的位置 /,而没有尾部斜杠的/webpack-dev-server 向您显示了一个包含所有已编译捆绑包的网页。其他对我有帮助的事情是从开发服务器配置中删除 publicPath 和文件名,并在我的页面上包括 &lt;script src="/webpack-dev-server.js"&gt;&lt;/script&gt;
          猜你喜欢
          • 2023-04-04
          • 1970-01-01
          • 2017-03-14
          • 2016-01-16
          • 1970-01-01
          • 2019-10-29
          • 2017-10-17
          • 2019-10-16
          • 1970-01-01
          相关资源
          最近更新 更多