Django、ReactJS、Webpack 热重载

Posted

技术标签:

【中文标题】Django、ReactJS、Webpack 热重载【英文标题】:Django, ReactJS, Webpack hot reload 【发布时间】:2018-10-06 07:22:49 【问题描述】:

我一直在尝试借助 Webpack 4 在 Django 中设置一个 React 组件。

为了让我开始,我阅读并阅读:

Using Webpack transparently with Django + hot reloading React components as a bonus

Tutorial: Django REST with React (Django 2.0 and a sprinkle of testing)

这两个演练都很棒。最后,尽管我使用的是 Django 1.11,但通过第二个链接,我几乎可以正常工作。

点击第二个链接后我遇到的问题是使用webpack-dev-server 时热重载不起作用。问题是 Django 无法读取 webpack-dev-server 的输出文件(给出 404 错误),而 main.js 可以读取。我读过dev-server 文件默认只存在于内存中。

为了克服热重载文件上出现错误 404 的问题,我安装了包 write-file-webpack-plugin 以写出每次重载的文件。然后将webpack-config.js 更改为(我删除了一些行以使其更短......):

var path = require('path');
//webpack is not needed since I removed it from plugins
//const webpack = require('webpack');
var BundleTracker = require('webpack-bundle-tracker');
var WriteFilePlugin =require('write-file-webpack-plugin');
module.exports = 
  module: 
    rules: [
      
        test: /\.js$/,
        exclude: /node_modules/,
        use: 
          loader: "babel-loader"
        
      ,
    ]
  ,
  entry: [
          './frontend/src/index',
          ],
  output: 
    path: path.join(__dirname, 'frontend/static/frontend'),
    // Changing the name from "[name]-[hash].js" to not get 1000 files in the static folder.
    filename: 'hotreloadfile.js'
  ,
  plugins: [
    //This line writes the file on each hot reload
    new WriteFilePlugin(),
    //This can be removed.
    //new webpack.HotModuleReplacementPlugin(),
    new BundleTracker(filename: './webpack-stats.json')
  ],
  mode:'development',
;

在我的package.json 中,脚本标签中有以下行:

"start": "webpack-dev-server --config ./webpack.config.js",

在 Django 中,我在 settings.py 中安装了 webpack-loader,并带有以下几行:

STATIC_URL = '/static/'

WEBPACK_LOADER = 
    'DEFAULT': 
        'BUNDLE_DIR_NAME': 'frontend/',
        'STATS_FILE': os.path.join(BASE_DIR, 'webpack-stats.json')
        

最后,在我的名为 index.js 的根组件中,我不需要 module.hot.accept();

您认为这种方法有什么缺点吗?除了我必须安装另一个包?

为什么我没有让它与 new webpack.HotModuleReplacementPlugin() 一起使用?

【问题讨论】:

你能解决这个问题吗? @西蒙 是的,我设法通过上述过程解决了这个问题。不知道它是否仍然有效,但有时会得到一些支持,因此该方法似乎仍然有效。 @GwynBleidD 这个问题没有答案。他们在问他们的方法是否合适以及为什么webpack.HotModuleReplacementPlugin() 对他们不起作用。这两个都是一个完全有效的问题。碰巧的是,他们为解决问题而采取的经过深入研究的方法对其他人非常有帮助.. 【参考方案1】:

如果您在 react 中开发前端并在 django 中开发后端,这是另一种方法。 我有 django 服务器在端口 8000 上运行,反应服务器在端口 3000 上运行。

如果我在 react 代码的 package.json 中添加 "proxy": "http://localhost:8000" 行,则 localhost:3000 将在 api 调用转到 localhost:8000 时进行热重载。

【讨论】:

以上是关于Django、ReactJS、Webpack 热重载的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有 django 的 react.js webpack 部署到 heroku?

导出默认不工作的webpack,reactjs

ReactJS webpack实现JS模块化使用的坑

reactjs学习--01

D1.1.利用npm(webpack)构建基本reactJS项目

带有 ReactJS、Webpack 和 Babel 的 Hello World