【问题标题】:How to fix require.ensure error Webpack, Babel6, React?如何修复 require.ensure 错误 Webpack、Babel6、React?
【发布时间】:2016-04-04 04:52:04
【问题描述】:

我尝试使用 require.ensure 为 Facility.js 创建一个块

import React, { Component } from 'react';
import { render } from 'react-dom';
class Facility extends Component {
    constructor(...args) {
        super(...args);
        this.state = {
              ....
        };
    }
    render() {
        return (
            <div>
                      ....
            </div>
        );
    }
}

export default Facility;
//Tried module.exports = Facility;

NonPatientSer.js

var Facility;
require.ensure([], function(require) { Facility = require('./Facility'); }, 'facility');

开发 我可以在我的源代码中看到 facility.bundle.js 但对其的调用返回 undefined 并且此错误

警告:React.createElement:类型不应为 null、未定义、 布尔值或数字。它应该是一个字符串(对于 DOM 元素)或 ReactClass(用于复合组件)。检查渲染方法 NonPatientSer

未捕获的不变违规:元素类型无效:预期为 字符串(用于内置组件)或类/函数(用于复合 组件)但得到:未定义。检查渲染方法 NonPatientSer.

生产(运行构建)

不允许加载本地资源: file:///C:/Users/.../facility.bundle.js

Webpack 配置

output: {
    path: path.join(__dirname, 'dist'),
    filename: 'bundle.js',
    publicPath:  __dirname + '/',
    chunkFilename: '[name].bundle.js'
  },

【问题讨论】:

  • 您如何使用NonPatientSer?请注意,require.ensure 是异步的,因此预计 Facility 最初将是 undefined。如果您的代码没有考虑到这一点,它很可能会按照您描述的方式失败。
  • @bebraw NonPatientSer 包含在主 bundle.js 文件中,并在应用程序启动时加载(我不确定您的确切含义)。正是我想要实现的,该文件将作为单独的文件包含在应用程序中。在 Webpack 文档中,我发现了这个 link[/link]

标签: javascript reactjs webpack babeljs


【解决方案1】:

首先,您需要修复 webpack.config 中的 publicPath 属性。你应该使用:

publicPath:  '/dist/'

而不是绝对路径。

其次,如果你使用es6语法导出模块:

export default Facility;

你应该这样写你的导入代码:

require.ensure([], function(require) {
  Facility = require('./Facility').default;
  ReactDOM.render(<Facility/>, document.getElementById('app'));
}, 'facility');

或者只是使用commonjs语法:

module.exports = Facility;

然后

require.ensure([], function(require) {
  Facility = require('./Facility');
  ReactDOM.render(<Facility/>, document.getElementById('app'));
}, 'facility');

另请参阅:http://www.2ality.com/2015/12/babel-commonjs.html

更新: 你可以在你的入口js文件中设置publicPath。例如:

entry.js

__webpack_public_path__ = '/publicPathToChunk/';

var chunk;
require.ensure([], function(require) { 
  chunk = require('./chunk'); 
}, 'chunk');

另外,你可以使用下一个技巧:

var bundleSrc = document.querySelector('[src*="bundle"]').getAttribute("src");
__webpack_public_path__ = bundleSrc.substr(0, bundleSrc.lastIndexOf("/") + 1);

【讨论】:

  • 它不起作用,对不起。我必须使用 require.ensure 来创建 App 块,不仅需要导入
  • 感谢它的工作,只发生了一个问题...bundle.js?ver=1.11:1Not allowed to load local resource: file:///C:/Users/.../facility.bundle.js 当我尝试重新加载页面但如果它从链接开始时工作正常。
  • componentDidMount(){ var Facility; require.ensure([], function(require) { Facility = require('./Facility').default; render(&lt;Facility/&gt;, document.getElementById('fl')); }, 'facility'); } render() { return ( &lt;div&gt; &lt;div id="fl"&gt;&lt;/div&gt;
  • 您修复了您的 publicPath 属性吗?你是否使用任何服务器(例如 webpack-dev-server)?
  • 是的。我认为我需要__webpack_public_path__ in runtime(不知道该怎么做)因为所有这些都是为 wp 插件完成的。你有任何实现它的经验吗?
猜你喜欢
  • 2020-03-07
  • 2022-01-21
  • 1970-01-01
  • 2019-12-20
  • 2017-01-26
  • 1970-01-01
  • 2016-04-24
  • 2022-06-24
  • 2016-02-14
相关资源
最近更新 更多