当前位置: 首页 > 知识库问答 >
问题:

用express webpack dev中间件/webpack热中间件替换webpack dev服务器

益绯辞
2023-03-14

我目前试图取代我的旧的设置,使用webpack-开发服务器与一个更健壮的解决方案,基于快速webpack-中间件。所以我过去是这样运行它的:"webpack-dev-server-内容-基础公共/-历史-api-回退",但现在我想这样使用它:"节点devServer.js"。以下是我当前设置的详细信息。

网页包。配置。dev.js:

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

debug.enable('app:*');

var log = debug('app:webpack');

log('Environment set to development mode.');
var NODE_ENV = process.env.NODE_ENV || 'development';
var DEVELOPMENT = NODE_ENV === 'development';

log('Creating webpack configuration with development settings.');
module.exports = {
  devtool: 'cheap-module-eval-source-map',
  entry: [
    'eventsource-polyfill', // necessary for hot reloading with IE
    'webpack-hot-middleware/client',
    './src/index',
    './src/scss/main.scss',
  ],
  output: {
    path: path.join(__dirname, 'public/js'),
    filename: 'bundle.js',
    publicPath: '/'
  },
  plugins: [
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NoErrorsPlugin()
  ],
  module: {
    loaders: [{
      test: /\.jsx?/,
      loaders: ['babel'],
      include: path.join(__dirname, 'src')
    },
    {
      test: /\.scss$/,
      loader: 'style!css!sass',
    }]
  },
  compiler: {
    hash_type: 'hash',
    stats: {
      chunks: false,
      chunkModules: false,
      colors: true,
    },
  },
};

devServer。js:

var path = require('path');
var express = require('express');
var webpack = require('webpack');
var debug = require('debug');
// var history = require('connect-history-api-fallback');
var config = require('./webpack.config.dev');
var browserSync = require('browser-sync');

debug.enable('app:*');

var app = express();
var compiler = webpack(config);
var log = debug('app:devServer');

// app.use(history({ verbose: false }));

log('Enabling webpack dev middleware.');
app.use(require('webpack-dev-middleware')(compiler, {
  lazy: false,
  noInfo: true,
  publicPath: config.output.publicPath,
  quiet: false,
  stats: config.compiler.stats,
}));

log('Enabling Webpack Hot Module Replacement (HMR).');
app.use(require('webpack-hot-middleware')(compiler));


log('Redirecting...');
app.get('/', function(req, res) {
    res.sendFile(path.join(__dirname, '/public/', 'index.html'));
});

app.get('/js/bundle.js', function(req, res) {
    res.sendFile(path.join(__dirname, '/public/js/', 'bundle.js'));
});


var port = 3000;
var hostname = 'localhost';

app.listen(port, hostname, (err) => {
  if (err) {
    log(err);
    return;
  }
  log(`Server is now running at http://${hostname}:${port}.`);
});

var bsPort = 4000;
var bsUI = 4040;
var bsWeInRe = 4444;

browserSync.init({
  proxy: `${hostname}:${port}`,
  port: bsPort,
  ui: {
    port: bsUI,
    weinre: { port: bsWeInRe },
  },
});

你能告诉我哪里出了问题吗?我的印象是,我已经涵盖了所有的基础,但很明显,我遗漏了一些东西,因为尽管我能够访问html和js,但页面并没有显示出来(

共有3个答案

施琦
2023-03-14

像这样的东西对我很有用:

更改:

app.use(require('webpack-dev-middleware')(compiler, {

致:

var middleware = require('webpack-dev-middleware');
app.use(middleware)(compiler, {

然后更改你的应用程序。获取:

app.get('/js/bundle.js', function(req, res){
  res.write(middleware.fileSystem.readFileSync(req.url));
  res.end();
});

app.get('*', function(req, res){
  res.write(middleware.fileSystem.readFileSync(path.join(__dirname, '/public/', 'index.html'))));
  res.end();
});

我无法测试您的特定配置,所以我想知道您是否会与第一个app.get有问题,因为您正在请求一个不同于您正在服务的url,即/js/bundle.js到/Public/js/bundle.js'如果是,请尝试path.join(__dirname,'/Public/js/bundle.js')而不是req.url

第二app.get应该为任何未解决的请求提供index.html,这对于React路由非常有效。

熊锐进
2023-03-14

尝试静态资产的相对路径,例如,使用而不是/public//public/,如图所示:

app.get('/', function(req, res) {
    res.sendFile(path.join(__dirname, '/public/', 'index.html'));
});

app.get('/js/bundle.js', function(req, res) {
    res.sendFile(path.join(__dirname, '/public/js/', 'bundle.js'));
});

>

  • 我猜你肯定无论这个devServer.js在哪里,在完全相同的位置都存在一个并行文件Public

    您正在点击的是localhost:3000/,而不是localhost:3000

    如果这不起作用,试试这个

    app.use(express.static(path.resolve(__dirname, './public'),{
        index: 'index.html'
    }));
    

  • 顾乐池
    2023-03-14

    你不需要这部分:

    app.get('/js/bundle.js', function(req, res) {
        res.sendFile(path.join(__dirname, '/public/js/', 'bundle.js'));
    });
    

    WebpackDev服务器中间件将为您实现这一点。所以,我认为只要去掉它就可以修复它。

     类似资料:
    • 我正在尝试使用webpack热中间件来热加载我的应用程序的模块。我也在使用webpack开发中间件。 这是我的设置。 包裹json 网页包。配置。js srcServer。js 安装程序不工作。当我更新代码时,编译工作正常,当我刷新浏览器时,新的应用程序代码被执行。但是,这些模块没有被更换。 浏览器控制台中的输出 网络流量 请帮我解决这个问题。谢谢

    • Macaron 会注入一些默认服务来驱动您的应用,这些服务被称之为 核心服务。也就是说,您可以直接使用它们作为处理器参数而不需要任何附加工作。 请求上下文(Context) 该服务通过类型 *macaron.Context 来体现。这是 Macaron 最为核心的服务,您的任何操作都是基于它之上。该服务包含了您所需要的请求对象、响应流、模板引擎接口、数据存储和注入与获取其它服务。 使用方法: pa

    • 调用中间件的形式为: func( name string, args []reflect.Value, context Context, next NextInvokeHandler) (results []reflect.Value, err error) { ... results, err = next(name, args, context)

    • 问题内容: 我在示例的底部创建了一个运行在端口3000上的小型服务器。您可以通过“ htto:// localhost:3000 / time”访问它。整个请求包含两个中间件。第一个“ cancelHandler”和第二个“ otherHandler”被调用-在4秒钟后响应一些虚拟数据。 对我的问题: 当我在浏览器中请求页面,然后取消请求时(在4秒之前)。服务器仍在后台处理goroutine /请

    • 1.自我介绍。 1.1自我介绍中提到了一个未来打算做的项目,问我准备实现的功能。 2.手撕代码(提供的平台有点不太行) 2.1 代码思路? 2.2 写的代码时间复制度多少? 2.3 能想一个o(n)的复杂度方法吗? 3.直接问项目了(项目中用到的)。 3.1 用户关注、发帖、点赞等场景怎么设计,数据库存什么? 3.2关注场景用redis怎么存,用户关注的人和谁关注了用户的场景。 3.3对redis

    • 中间件 captcha 用于为 Macaron 实例 提供验证码服务。 GitHub API 文档 下载安装 go get github.com/go-macaron/captcha 使用示例 想要使用该中间件,您必须同时使用 cache 中间件。 // main.go import ( "github.com/go-macaron/cache" "github.com/go-ma