'rollup-plugin-node-resolve'无法与react的useState一起使用,如何解决?

时间:2019-03-15 09:20:10

标签: reactjs typescript rollup

在一个打字稿项目中,我同时使用typescript + rollup + rollup-plugin-node-resolve + React的useState,但是在运行rollup -c时会抛出错误:< / p>

1: import {useState} from "react";
           ^
2: 
Error: 'useState' is not exported by node_modules/react/index.js

我的代码很简单:

import {useState} from "react";

console.log(useState);

rollup.config.js是:

import commonjs from 'rollup-plugin-commonjs';
import resolve from 'rollup-plugin-node-resolve';
import typescript from 'rollup-plugin-typescript2';

export default {
  input: 'index.ts',
  output: [
    {
      file: 'bundle.js',
      format: 'cjs',
    }
  ],
  plugins: [
    resolve(),
    commonjs(),
    typescript(),
  ]
};

package.json 是:

{
  "scripts": {
    "demo": "rollup -c && node bundle.js"
  },
  "dependencies": {
    "react": "16.8.4"
  },
  "devDependencies": {
    "@types/react": "16.8.8",
    "rollup": "1.6.0",
    "rollup-plugin-commonjs": "9.2.1",
    "rollup-plugin-node-resolve": "4.0.1",
    "rollup-plugin-typescript2": "0.20.1",
    "typescript": "3.3.3333"
  }
}

tsconfig.json

{
  "compilerOptions": {
    "strict": true,
    "target": "es6",
    "module": "esnext",
    "noImplicitAny": true,
    "removeComments": true,
    "preserveConstEnums": true,
    "moduleResolution": "node",
    "sourceMap": true,
    "jsx": "react",
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true
  }
}

如果我从resolve()中删除了rollup.config.js,则汇总将正确捆绑它。但是我需要在实际项目中使用resolve()

哪里出了问题以及如何解决?

PS:完整的代码演示在这里:https://github.com/freewind-demos/typescript-react-rollup-use-state-demo

3 个答案:

答案 0 :(得分:2)

作为@Tholle提供的答案链接,问题在于rollup-plugin-commonjs不能从react找到setState导出,因为react声明如下:

const React = {
    setState
}
module.exports = React

rollup-plugin-commonjs无法处理这种形式的导出,因此我们必须在rollup.config.js中定义一些命名的导出,例如:

plugins: [
   'react': ['useState']
]

答案 1 :(得分:0)

这个设置对我有用

// rollup config 
plugins: [
   commonjs({
      // ... other commonjs config options
      namedExports: {
         // https://github.com/rollup/rollup-plugin-commonjs#custom-named-exports
         'node_modules/react/index.js': ['useState', 'useRef', 'useEffect'],
       },
     }),
],

答案 2 :(得分:0)

我发现我需要在 package.json 中添加 peerDependencies:

"peerDependencies": {
    "react": "^17.0.1",
    "react-dom": "^17.0.1"
  }