Nextjs 从父目录导入外部组件

Posted

技术标签:

【中文标题】Nextjs 从父目录导入外部组件【英文标题】:Nextjs import external components from parent directory 【发布时间】:2020-12-06 14:15:41 【问题描述】:

我有外部目录common,我想将该目录中的反应组件导入web-static。在web-static 我正在使用nextjs。

目前我有这个错误:

Module not found: Can't resolve 'react' in '/Users/jakub/Sites/WORK/wilio-web-common/common/src/@vendor/atoms'

我将这些行添加到next.config.js

const babeRule = config.module.rules[babelRuleIndex];
if (babeRule && babeRule.test) 
  babeRule.test = /\.(web\.)?(tsx|ts|js|mjs|jsx)$/;
  if (babeRule.include) 
    babeRule.include = [
      ...babeRule.include,
      resolve(__dirname, "../common/src/@vendor"),
    ];
  

config.resolve.alias = 
  ...config.resolve.alias,
  "@vendor": resolve(__dirname, "../common/src/@vendor")
;

我的tsconfig.json 文件:

"paths": 
  "@vendor/*": ["../common/src/@vendor/*"]

Webpack 可以解析这些组件,但无法解析这些组件中安装的包。

../common/src/@vendor/atoms/Test.js
Module not found: Can't resolve 'react' in '/Users/user1/Sites/WORK/web-app/common/src/@vendor/atoms'

我是否需要将此目录也包含在 webpacks config.externals 中?当前 nextjs webpack externals

-----
options.isServer: false
[ 'next' ]
-----
-----
options.isServer: true
[ [Function] ]
-----

如何做到这一点?感谢您的帮助

【问题讨论】:

你想如何使用这些反应组件?通过脚本标签?因为那么你可以添加一个入口点来编译所有这些并将其资产输出到 web-static 通过import声明 那么为什么所有输出文件都在网络静态中很重要?为什么不直接从他们的位置导入它们呢?拥有 web-static 文件夹有什么好处? 什么输出文件?网络静态目录是 nextjs 应用程序。我想将外部目录../common 中的 react 组件导入 nextjs 目录。 好的。输出文件是指 webpack 块。祝你好运,希望你能找到答案。显然我对 nextJs 平台缺乏了解 【参考方案1】:

这样试试

next.config.js

module.exports = 
  webpack: function (config,  defaultLoaders ) 
    const resolvedBaseUrl = path.resolve(config.context, "../");
    config.module.rules = [
      ...config.module.rules,
      
        test: /\.(tsx|ts|js|mjs|jsx)$/,
        include: [resolvedBaseUrl],
        use: defaultLoaders.babel,
        exclude: (excludePath) => 
          return /node_modules/.test(excludePath);
        ,
      ,
    ];
    return config;
  
;

【讨论】:

【参考方案2】:

从 Next.js 10.1.2 开始,您可以在 next.config.js 中使用当前的experimental externalDir 选项:

module.exports = 
  experimental: 
    externalDir: true,
  ,
;

请注意,要使 React 组件正常工作,我还必须将根 package.json 声明为 yarn workspace:


  // ...
  "private": true,
  "workspaces": ["next-js-directory"],
  // ...

【讨论】:

对我来说,这不需要向我的 package.json 添加工作区

以上是关于Nextjs 从父目录导入外部组件的主要内容,如果未能解决你的问题,请参考以下文章

Nextjs外部css没有在客户端页面转换上更新

访问组件外部的 React 上下文

如何在 NextJS 中为 getStaticProps 导入 API 路由?

Atlas集成外部组件—集成HiveHBaseKafka

如何从 Vue 实例外部触发 Stencil 组件功能/方法

Storybook - 如何使用样式组件(React + TS)从外部项目导入组件?