1

我在使用 js 互操作时遇到问题。我正在尝试像这样使用 js 组件react-slick

// src/interop/Carousel.js
import React from 'react'
import Slider from 'react-slick'

export function Carousel(props) {
  return (
    <Slider>
      <div>
        <h3>{props.name} 1</h3>
      </div>
    </Slider>
  )
}


/* src/Carousel.re */
[@bs.module  "./interop/Carousel"] [@react.component]
external  make: (~name: string) =>  React.element  =  "";

/* src/index.re */
ReactDOMRe.renderToElementWithId(<Carousel  name="ahaha"  />,  "carousel");

但是在 webpack 中遇到了这个错误:

ERROR in ./lib/js/src/Index.bs.js
Module not found: Error: Can't resolve './interop/Carousel' in '[...]/reason_react_example/lib/js/src'
 @ ./lib/js/src/Index.bs.js 6:15-44

所以看起来BSCarousel.js在编译时不考虑文件?

顺便说一句,我正在关注这个原因反应文档

4

2 回答 2

2

BuckleScript 默认情况下会将生成的 js 工件放入其中lib/js/...,因此您要么必须编写相对于它的导入,要么配置bsb将工件放在源文件旁边。"in-source": true您可以通过设置给定package-spec的 in来执行后者bsconfig.json。例如:

{
  "package-specs": {
    "module": "commonjs",
    "in-source": true
  }
}

请参阅配置项的文档package-specs

于 2019-04-14T13:35:08.970 回答
1

经过一些调整,这对我有用:

// lib/js/src/interop/Carousel.js
import React from 'react'
import Slider from 'react-slick'

const Carousel = props => {
  return (
    <Slider>
      <div>
        <h3>{props.name} 1</h3>
      </div>
    </Slider>
  )
}

export default Carousel


// src/Carousel.re    
[@bs.module "./interop/Carousel"] [@react.component]
external make: (~name: string) => React.element = "default"; // handle default export

// src/Index.re
ReactDOMRe.renderToElementWithId(<Carousel name="it works!" />, "carousel");

由于Carousel.js使用的是 es6 和 jsx,我需要设置 webpack 来使用它(es6jsx)。并且bsconfig.json需要有这些设置:

"reason": {
  "react-jsx": 3
},
"package-specs": [
  {
    "module": "commonjs",
    "in-source": false
  }
]
于 2019-04-14T15:09:08.927 回答