create-react-app搭建react开发环境中的public/index.html.

使用create-react-app创建一个简单的react项目,会在项目的根目录下生成一个入口文件index.js,其内容大致如下:

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
);

上述代码中,document.getElementById("root")这句就是把根组件挂载在根页面中,该页面位于项目的根目录public/index.html,其内容大致如下:

<body>
    <noscript>
      You need to enable JavaScript to run this app.
    </noscript>
    <div id="root"></div>
  </body>

上述代码中,<div id="root"></div>和document.getElementById("root")相对应.
我的问题是,在开发环境下没有打包文件的情况下,index.js中的document.getElementById("root")是如何能够关联到另一个目录public/index.html文件呢,这两者之间好像没有引用关系.

阅读 18k
3 个回答

create-react-app采用一个react-scripts这个库,你的问题回答很简单,看看源码就知道了。react-scripts包里面的config文件里面有一个webpack.config.dev.js这个webpack配置文件,从配置文件中可以清楚看到下面这段代码。

 new HtmlWebpackPlugin({
      inject: true,
      template: paths.appHtml,
    }),

其中这个paths对应的文件就是同级目录下paths.js这个文件,怎么得到来的?webpack.config.dev.js有一行代码写的很清楚。

const paths = require('./paths');

而paths.js这个文件中,很清楚可以看到appHtml对应的正是public/index.html文件。源码是个好东西,多看看!

module.exports = {
  dotenv: resolveApp('.env'),
  appPath: resolveApp('.'),
  appBuild: resolveApp('build'),
  appPublic: resolveApp('public'),
  appHtml: resolveApp('public/index.html'),
  appIndexJs: resolveApp('src/index.js'),
  appPackageJson: resolveApp('package.json'),
  appSrc: resolveApp('src'),
  yarnLockFile: resolveApp('yarn.lock'),
  testsSetup: resolveApp('src/setupTests.js'),
  appNodeModules: resolveApp('node_modules'),
  publicUrl: getPublicUrl(resolveApp('package.json')),
  servedPath: getServedPath(resolveApp('package.json')),
  // These properties only exist before ejecting:
  ownPath: resolveOwn('.'),
  ownNodeModules: resolveOwn('node_modules'), // This is empty on npm 3
};

打包完再看。

打包工具会自动在 </body> 前面添加 script 的引用。

新手上路,请多包涵

因为在webpack.config.dev.js定义的entry中可以看到是paths.appIndexJs

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题