TL:DR转译您的代码或使用:
import { SortablePane, Pane } from 'react-sortable-pane/lib/react-sortable-pane.es5'
;
第一件事。
两个主要文件夹 Src 和 Lib
javascript 项目的一个常见约定是将所有开发代码放入一个名为src
. 此文件夹可能包含诸如 ES5 或 ES6 之类的代码,具体取决于开发人员想要使用的内容。
另一个主文件夹通常被调用lib
,其中包含所有被转换的代码src
(例如使用 babel 从 ES6 到 ES5)、转换和通常捆绑(例如 webpack minify),以便它可以在 npm 包支持的浏览器中工作(明显因包装而异)。该文件夹仅包含与使用该软件包的用户相关的代码,即所有测试都没有被转换和捆绑,因为它们没有理由这样做。
入口点
npm 包的另一个重要部分是 npm 包的入口点。默认情况下,NodeJS 会在导入的包中查找 index.js 文件(我认为)。这可以通过main
在 package.json 中提供密钥来覆盖。
react-motion 的 package.json 中的示例:
"main": "lib/react-motion.js"
我们可以看到 this 指向lib
。但是他们的 Github 上的 lib 文件夹在哪里???这不是他们的,因为通常您不想签入 lib 文件夹以进行源代码管理,因为它只是为 npm 包编译。
我们可以通过安装 react-motion 并查看node_modules/react-motion
. 这里的 lib 文件夹包含已转译的代码,可以在任何没有 babel 的浏览器中使用。
但是为什么不是所有的 npm 包都为我做这个!?!??!
大多数人这样做,他们应该这样做。我在我的包裹里做。
react-sortable-plane npm 包正在使用它"jsnext:main": "./lib/react-sortable-pane.js"
,这基本上意味着它在任何地方都使用 ES5 语法,但具有导入/导出功能,我以前从未见过,因为它没有被广泛使用。
请参阅https://github.com/rollup/rollup/wiki/pkg.module#wait-it-just-means-import-and-export--not-other-future-javascript-features
至于为什么他们只使用带有 ES5 功能的导入/导出,我想这是因为导入/导出现在已经成为标准,但我不确定。
如果您想要旧版浏览器支持或仅导入 .es5.js 文件,您仍然需要编译此包,例如:
import { SortablePane, Pane } from 'react-sortable-pane/lib/react-sortable-pane.es5';
希望这可以帮助。我知道它与 UMD、Common、Node 等这么多该死的环境令人困惑……