javascript - 如何在 Next.js 中为 material-ui 正确配置 babel?

标签 javascript node.js material-ui next.js babeljs

文档:
https://material-ui.com/guides/minimizing-bundle-size/#development-environment
"在你的项目根目录下创建一个 .babelrc.js 文件:

const plugins = [
  [
    'babel-plugin-transform-imports',
    {
      '@material-ui/core': {
        // Use "transform: '@material-ui/core/${member}'," if your bundler does not support ES modules
        'transform': '@material-ui/core/esm/${member}',
        'preventFullImport': true
      },
      '@material-ui/icons': {
        // Use "transform: '@material-ui/icons/${member}'," if your bundler does not support ES modules
        'transform': '@material-ui/icons/esm/${member}',
        'preventFullImport': true
      }
    }
  ]
];

module.exports = {plugins};"
https://nextjs.org/docs/advanced-features/customizing-babel-config
“要添加具有自定义配置的预设/插件,请在下一个/babel 预设上执行此操作,如下所示:
{
  "presets": [
    [
      "next/babel",
      {
        "preset-env": {},
        "transform-runtime": {},
        "styled-jsx": {},
        "class-properties": {}
      }
    ]
  ],
  "plugins": []
}"

问题:
如何在 Next.js 中为 material-ui 正确配置 babel?我在下面的实现显然是不正确的 import { ConstructionOutlined } from '@material-ui/icons';在开发模式下仍然会导致很长的加载时间。在尝试以下实现和变体时,我没有观察到错误消息。

代码:
{
    "presets": [
        [
        "next/babel",
        {
            "babel-plugin-transform-imports":
            {
                "@material-ui/core": {
                    // Use "transform: '@material-ui/core/${member}'," if your bundler does not support ES modules
                    "transform": "@material-ui/core/esm/${member}",
                    "preventFullImport": true
                },
                "@material-ui/icons": {
                    // Use "transform: '@material-ui/icons/${member}'," if your bundler does not support ES modules
                    "transform": "@material-ui/icons/esm/${member}",
                    "preventFullImport": true
                }
            }
        }
        ]
    ],
    "plugins": []
}
或者
module.exports = {
    presets: [
        ["next/babel"]
    ],
    plugins: [
         [
             'babel-plugin-import',
             {
                 'libraryName': '@material-ui/core',
                 // Use "'libraryDirectory': ''," if your bundler does not support ES modules
                 'libraryDirectory': 'esm',
                 'camel2DashComponentName': false
             },
             'core'
         ],
         [
             'babel-plugin-import',
             {
                 'libraryName': '@material-ui/icons',
                 // Use "'libraryDirectory': ''," if your bundler does not support ES modules
                 'libraryDirectory': 'esm',
                 'camel2DashComponentName': false
             },
             'icons'
         ],
    ]
}
要不然 ?

最佳答案

我完全可以理解你的问题。按照这个。

  • npm install babel-plugin-import --save-dev
  • 创建 .babelrc在 next.js 项目的根目录中创建文件,内容如下:
  • {
      "presets": ["next/babel"],
      "plugins": [
          [
          'babel-plugin-import',
          {
            libraryName: '@mui/material',
            libraryDirectory: '',
            camel2DashComponentName: false,
          },
          'core',
        ],
        [
          'babel-plugin-import',
          {
            libraryName: '@mui/icons-material',
            libraryDirectory: '',
            camel2DashComponentName: false,
          },
          'icons',
        ],
      ]
    }
    
  • 重新启动您的开发服务器。
  • 上面的 babel 配置将转换

  • // from
    import { Button, TextField } from '@mui/material'; ( great developer experience)
    
    // to
    import Button from '@mui/material/Button'; (smaller bundle size means great user experience)
    import TextField from '@mui/material/TextField';
    
  • 结果,你会注意到
  • 更快地加载开发服务器。
  • 更小的包大小
  • 还可以使用 next/link 和 fallback:true 更快地进行客户端导航。


  • 来源:Babel 配置文档
    Mui
    Next.js
    希望它也适合你!

    关于javascript - 如何在 Next.js 中为 material-ui 正确配置 babel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68512855/

    相关文章:

    node.js - 如何降低nodejs服务器端音频文件的音调?

    javascript - 将 jekyll 标签放入 "onclick"中断处

    javascript - 多个子协议(protocol) Websocket Javascript 客户端和 Libwebsockets 服务器不工作

    javascript - 如何在完成一个功能后调用不同的功能?

    html - Material -ui表: how to make style changes to table elements

    javascript - Material-UI 更改抽屉颜色

    javascript - 使用 margin auto 使文本框居中

    javascript - React 在第三状态中合并两个状态

    javascript - 正则表达式 - 后跟字母时匹配一定数量的数字

    node.js - 如何隐藏由 "pm2 start"创建的 Node cmd 窗口