【问题标题】:Using ES Modules with babel-standalone将 ES 模块与 babel-standalone 一起使用
【发布时间】:2020-09-14 11:49:53
【问题描述】:

引用 babel 文档https://babeljs.io/docs/en/babel-standalone#usage

"如果你想使用浏览器对 ES 模块的原生支持,通常需要在脚本标签上设置 type="module" 属性。使用@babel/standalone,设置 data-type="module "改为属性"

尽管出于某种原因,当包含我的主 index.js 文件(它使用 import 导入其他 js / jsx 文件)时,babel 似乎正在将我的 import 语句转换为 require 语句,因为我得到 ReferenceError: require is not defined .

我发现解决这个问题的唯一方法是使用 transform-modules-umd 插件并将我的所有 js 文件作为脚本包含在内。不确定这是否是 data-type="module" 不起作用的错误,或者我遗漏了什么。

这些是我在 index.html 中的脚本标签

<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>

<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>

<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>

<script src="index.js" type="text/babel" data-type="module"></script>

感谢您的帮助

【问题讨论】:

    标签: javascript reactjs babeljs es6-modules umd


    【解决方案1】:

    Amareis 在 babel 的 github 页面上回答了我的问题:https://github.com/babel/babel/discussions/12059

    问题是 babel 不会对通过 ES 模块导入的模块进行转译,它们必须明确地作为脚本包含在“type”设置为“text/babel”的脚本中。所以 index.js 脚本中通过 ES 模块导入的 JSX 文件是在 index.js 被 babel 转译后导入的,本身并没有转译。

    还有一个建议是为了开发目的使用服务工作者获取和执行我的脚本。 babel-standalone 在获取后对它们进行转换

    【讨论】:

      【解决方案2】:

      为了(我的)未来参考,这是一个完整的工作示例。

      您只需将下面的代码放入 index.html 并在 Web 浏览器中运行它,您将拥有一个使用 JSX 的 React 应用程序。

      来源:https://codesandbox.io/s/dikoh?file=/index.html

        <!DOCTYPE html>
        <html lang="en">
          <head>
            <meta charset="UTF-8" />
            <meta name="viewport" content="width=device-width, initial-scale=1.0" />
            <meta http-equiv="X-UA-Compatible" content="ie=edge" />
            <title>Static Template</title>
          </head>
          <body>
            <div id="main"></div>
        
            <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
            <script type="text/babel" data-presets="react" data-type="module">
              import {
                ChakraProvider,
                Box,
                Text
              } from "https://cdn.skypack.dev/@chakra-ui/react";
              import React, { useRef } from "https://cdn.skypack.dev/react";
              import ReactDOM from "https://cdn.skypack.dev/react-dom";
        
              const MyText = ({ color, ...props }) => {
                return <Text fontWeight="bold" as="span" {...props} />;
              };
        
              function Foo() {
                return (
                  <div>
                    Foo
                  </div>
                );
              }
        
              function App() {
                return (
                  <Box>
                    Hello <MyText>Skypack</MyText>
                    <Foo/>
                  </Box>
                );
              }
        
              ReactDOM.render(
                <ChakraProvider>
                  <App />
                </ChakraProvider>,
                document.getElementById("main")
              );
            </script>
          </body>
        </html>
      

      【讨论】:

        猜你喜欢
        • 2019-07-30
        • 2020-12-22
        • 2019-09-30
        • 2016-03-02
        • 1970-01-01
        • 1970-01-01
        • 2020-06-04
        • 2016-02-04
        • 1970-01-01
        相关资源
        最近更新 更多