Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 在单独的文件中拆分React组件,而无需显式导入_Reactjs_Webpack_Sinatra_Code Splitting - Fatal编程技术网

Reactjs 在单独的文件中拆分React组件,而无需显式导入

Reactjs 在单独的文件中拆分React组件,而无需显式导入,reactjs,webpack,sinatra,code-splitting,Reactjs,Webpack,Sinatra,Code Splitting,我正在写一个基于Ruby Sinatra后端的React应用程序。main.js文件呈现应用程序: import React from 'react'; import ReactDOM from 'react-dom'; import Galery from './components/Galery' ReactDOM.render( <Galery />, document.getElementById('app') ); 简短答复: 强烈建议您在任何需要的地方使用显式

我正在写一个基于Ruby Sinatra后端的React应用程序。main.js文件呈现应用程序:

import React from 'react';
import ReactDOM from 'react-dom';
import Galery from './components/Galery'

ReactDOM.render(
  <Galery />,
  document.getElementById('app')
);
简短答复:

强烈建议您在任何需要的地方使用显式导入,因为像webpack这样的工具通过删除未使用的函数来围绕包大小进行智能优化。记住这一点,最简单的答案是:使用webpack+babel+React的方式,无法避免为每个文件定义导入

详细回答:

是的,你能做到,但这不是直截了当的。与Ruby不同,常量/变量查找在JavaScript中的工作方式不同。在Ruby中,以下功能很好:

# a.rb
A = 10

# b.rb
require "./a.rb"
puts a # => 10
这是因为当解析文件a.rb并将其包含到b.rb中时,Ruby中不会创建额外的子命名空间。所有顶级单元都存在,就好像它们是在b.rb中定义的一样

为了将其与JS进行比较,我需要澄清一下模块包含的工作方式。到目前为止,情况相当复杂。让我们先考虑一下NoDEJs。在这种非浏览器环境中,除了目前具有额外标志v 9的最新版本外,尚未实现任何导入功能。所以,当您使用像webpack和import这样的东西时,内部发生的情况是这些东西被转换为webpack自己的文件。import和require转换的方式有细微的不同,因为前者是静态样式加载器,而后者是动态样式加载器。在一个非常基本的级别上,这意味着导入语句应该位于文件的顶部,require语句可以位于任何位置,当解释器遇到该行时,文件解析就会发生。这会产生奇怪的效果,如下所示

NodeJ需要的工作方式是从包含的文件中标识module.exports对象。该对象指定哪些函数/对象暴露在外部。因此,与Ruby不同,如果您喜欢module.exports,则已经存在一个隐式的本地名称空间或分组,而不是全局$LOADED\u功能:

解决这个问题的一种方法是全局变量。就像Ruby一样,JavaScript有一个隐式全局名称空间,尤其是在通过窗口的浏览器中更为常见,而在NodeJS中则是全局的。一个想法是:

// main.js

import React from 'react';
import ReactDOM from 'react-dom';

import Image from 'components/image.js';
import Gallery from 'components/gallery.js';

window.React = React;
window.ReactDOM = ReactDOM;
window.Image = Image;
window.Gallery = Gallery;

// gallery.js

export default class Gallery extends React.Component {
  render() {
    return <Image />;
  }
}

正如您所看到的,要让JavaScript应用程序运行,这项工作太多了。但主要的问题是,webpack无法进行任何智能优化,因为它不知道您没有使用哪些功能。因此,最好避免这样做。

我不确定它是否适用于您自己的模块,但您可以尝试使用ProvidePlugin:。然而,这看起来是个坏主意,通常最好是显式导入,以避免文件之间存在显式耦合。
# a.rb
A = 10

# b.rb
require "./a.rb"
puts a # => 10
// a.js
const a = 10;
module.exports = { a: a };

// b.js

const a = require('./a.js');
console.log(a); // { a: 10 };
// main.js

import React from 'react';
import ReactDOM from 'react-dom';

import Image from 'components/image.js';
import Gallery from 'components/gallery.js';

window.React = React;
window.ReactDOM = ReactDOM;
window.Image = Image;
window.Gallery = Gallery;

// gallery.js

export default class Gallery extends React.Component {
  render() {
    return <Image />;
  }
}
// main.js

const React = require('react');
const ReactDOM = require('react-dom');

window.React = React;
window.ReactDOM = ReactDOM;

const Image = require('components/image.js').default;
const Gallery = require('components/gallery.js').default;

window.Image = Image;
window.Gallery = Gallery;

// gallery.js

export default class Gallery extends React.Component {
  render() {
    return <Image />;
  }
}