【问题标题】:Can I use webpack's hot module reloading with sailsjs?我可以使用带有sails js的webpack热模块重新加载吗?
【发布时间】:2016-01-04 04:38:33
【问题描述】:

我正在使用sails.jsreact 开展一个项目。我希望能够使用 Webpack 的 hot module replacement,这样我就可以编辑我的代码并立即在浏览器上进行更改。但是,如何将它们全部连接起来似乎并不明显。

我希望能够使用 $ sails lift 并让它正常工作。

如果这是一个 node.js 项目,我只需将 webpack 配置为使用 react-transform-hmr 并从 package.json 启动 webpack-dev-server(例如 as described here)。但是,这似乎不是一件非常帆式的事情。

我看到模块 webpack-hot-middleware 声称能够“在没有 webpack-dev-server 的情况下将热重载添加到现有服务器中”。但是,我不确定在 Sails >0.10 中添加 Express 中间件配置的合适位置在哪里。

谁能推荐一个好的设置方法?

【问题讨论】:

    标签: node.js reactjs sails.js webpack webpack-hmr


    【解决方案1】:

    好的,经过一番思考,一个好方法看起来是使用sails http 中间件配置的旧customMiddleware 选项,但仅适用于config/env/development.js 中保存的开发环境。

    1) 安装 react 和 react-dom(如果你还没有的话):

    $ npm install react react-dom --save
    

    2) 安装 webpack,热模块重载(& ES6)支持sails:

    $ npm install sails-webpack babel-core babel-loader \
      babel-plugin-syntax-class-properties babel-plugin-syntax-decorators \
      babel-plugin-syntax-object-rest-spread \
      babel-plugin-transform-class-properties \
      babel-plugin-transform-decorators-legacy \
      babel-plugin-transform-object-rest-spread \
      babel-preset-es2015 babel-preset-react \
      copy-webpack-plugin file-loader --save
    

    3) 安装 react 转换和中间件以进行热模块重载:

    $ npm install babel-plugin-react-transform
      react-transform-catch-errors react-transform-hmr \
      webpack-dev-middleware webpack-hot-middleware --save-dev
    

    4) 禁用通常会链接您的应用程序的内置 grunt 钩子:

    // .sailsrc 
    {
      "hooks": {
        "grunt": false
      }
    }
    

    5) 配置sails webpack配置:

    // config/webpack.js
    
    var webpack = require('webpack');
    var CopyWebpackPlugin = require('copy-webpack-plugin');
    var path = require('path');
    
    // compile js assets into a single bundle file
    module.exports.webpack = {
      options: {
        context: path.join(__dirname, '..'),
    
        devtool: 'eval',
    
        entry: [
          './assets/js',
          'webpack-hot-middleware/client'
        ],
    
        output: {
          path: path.resolve(__dirname, '../.tmp/public'),
          publicPath: "/",
          filename: 'bundle.js'
        },
    
        plugins: [
          new webpack.HotModuleReplacementPlugin(),
          new webpack.NoErrorsPlugin(),
    
          /* Copy sails.io.js unmolested: */
          new CopyWebpackPlugin([
            {
              from: 'assets/js/dependencies',
              to: 'dependencies',
              force: true
            }
          ]),
        ],
    
        resolve: {
          extensions: ['', '.js', '.jsx']
        },
    
        module: {
          loaders: [
            {
              test: /\.jsx?$/,
              exclude: /(bower_components|node_modules)/,
              loader: 'babel',
            },
            { test: /\.css$/, loader: 'style!css' },
            {
              test: /\.jpe?g$|\.gif$|\.png$|\.svg$|\.woff$|\.ttf$|\.wav$|\.mp3$/,
              loader: "file" }
          ]
        }
      },
    
      // docs: https://webpack.github.io/docs/node.js-api.html#compiler
      watchOptions: {
        aggregateTimeout: 300
      }
    };
    

    6) 配置项目范围的.babelrc 以在开发模式下使用热模块重新加载:

    {
      "presets": [
        "es2015",
        "react",
      ],
      "plugins": [
        "syntax-class-properties",
        "syntax-decorators",
        "syntax-object-rest-spread",
        "transform-class-properties",
        "transform-decorators-legacy",
        "transform-object-rest-spread"
      ],
      "env": {
        "development": {
          "plugins": [["react-transform", {
            "transforms": [{
              "transform": "react-transform-hmr",
              "imports": ["react"],
              "locals": ["module"]
            }]
          }]]
        }
      }
    }
    

    7) 最后,将http.customMiddleware 配置添加到sails 的config/env/development.js

    module.exports = {
    
      /* ... */
    
      /*
       * Enable webpack hotloading while in development mode:
       */
    
      http: {
        customMiddleware: function (app) {
          var webpack = require('webpack');
          var webpackConfig = require('../webpack').webpack.options;
          var compiler = webpack(webpackConfig);
    
          app.use(require("webpack-dev-middleware")(compiler,
            {
              noInfo: true,
              publicPath: webpackConfig.output.publicPath
            }
          ));
          app.use(require("webpack-hot-middleware")(compiler,
            { reload: true }
          ));
        },
      }
    
      /* ... */
    };
    

    假设您在 assets/js/index.jsx(或类似)中有一个 react 应用程序和一个包含您的 bundle.js 文件的视图,您应该能够简单地 $ sails lift 并在浏览器的开发控制台上看到以下内容:

      |>    Now connected to Sails.
    \___/   For help, see: http://bit.ly/1DmTvgK
            (using browser SDK @v0.11.0)
    
    
    
    client.js:51 [HMR] connected
    

    而且繁荣你应该做生意了!

    【讨论】:

    • 我是sails-webpack的作者。请记住,对该模块的支持即将结束:github.com/balderdash-projects/sails-webpack/issues/2
    • 还要记住,sails-webpack 的说明指示完全禁用 grunt 钩子。如果您确实使用sails-webpack,您可能需要找到另一种方法来完成grunt hook 通过默认任务提供的功能(所有资产管道的东西,如clean、uglify、copy 等)。我目前正在尝试将 grunt-webpack 添加到开箱即用的组合中(还没有完全掌握)。也许 webpack 可以包含所有这些 - 我还没有熟悉它。
    • 看起来不错,它正在工作!但是应该添加什么样的代码来编译手写笔到css?谢谢!
    【解决方案2】:

    您的解决方案应该很好用,但我想为阅读本文的其他人提供另一个快速解决方案:

    您可以完全删除 Sails.js 构建管道并单独运行 webpack。在子 shell 中同时运行这两个命令应该可以解决问题。

    ( webpack & sails lift ; )

    两个命令都将运行,您将在终端中看到两个合并的输出。 Ctrl+C 也将正确杀死两者,因为它在子 shell 中运行。

    您可以创建一个 npm 脚本来避免每次都写出这两个命令。

    【讨论】:

      【解决方案3】:

      我们创建了自己的 Sails 挂钩来在内部处理 Webpack,目前效果很好。然而,配置需要一些清理:https://github.com/teamfa/sails-hook-webpack

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-20
        • 2016-07-04
        • 1970-01-01
        • 2019-03-13
        • 2023-03-04
        • 2018-06-16
        • 1970-01-01
        相关资源
        最近更新 更多