【问题标题】:Browserify cannot find npm moduleBrowserify 找不到 npm 模块
【发布时间】:2016-01-20 10:41:11
【问题描述】:

我正在尝试创建一个非常痛苦的 NPM 模块:react-smallgrid

import React from 'react';
import _ from 'lodash';


export default class SmallGrid extends React.Component{

编译:

browserify: {
    options: {
        transform: [
            ['babelify', {
                presets: ['react', 'es2015']
            }]
        ]
    },

    jsx: {
        files: {
            './dist/js/smallgrid.js': [
                './src/smallgrid.jsx',
            ]
        }
    },

当我在另一个项目/jsx 中导入 js 文件并尝试对其进行浏览时,它会给出错误:

错误:无法从“/Users/me/code/react-smallgrid/dist/js”中找到模块“./ReactMount”

我以为它已经编译好使用了?我不明白这个。

同时

我尝试使用 webpack 构建它,它会提供以下输出:

> webpack -p

Hash: 00fd87c95d39230bd485
Version: webpack 1.12.11
Time: 14002ms
       Asset    Size  Chunks             Chunk Names
smallgrid.js  248 kB       0  [emitted]  smallgrid
    + 160 hidden modules

WARNING in smallgrid.js from UglifyJs
Condition always true [./~/react/lib/ReactMount.js:764,0]
Condition always true [./~/react/lib/findDOMNode.js:46,0]
Condition always true [./~/react/lib/instantiateReactComponent.js:80,0]

还是不行。

【问题讨论】:

  • 你的 package.json 是什么样的? React 是否包含在您编译的库中?
  • @HenrikAndersson 是的,作为依赖项 (link)
  • @Tjorriemorrie 你能把消费项目如何尝试粘贴到importSmallGrid吗?
  • @DavidPine import SmallGrid from 'react-smallgrid';。在webpack branchnpm run kitchen_sink 可能更容易,我正在尝试使用示例文件复制问题
  • @Tjorriemorrie 你所有的例子现在都在工作。请检查答案和我发给你的 PR。

标签: reactjs npm ecmascript-6 browserify


【解决方案1】:

您需要使 React 库可用于您的代码。

运行这个来添加 browserify-shim:

npm i browserify-shim -D

将此添加到您的 package.json:

"browserify": {
  "transform": [
    "browserify-shim"
  ]
},
"browser": {
  "react": "./node_modules/react/dist/react.js",
  "react-dom": "./node_modules/react-dom/dist/react-dom.js",
  "lodash": "./node_modules/lodash"
},
"browserify-shim": {
  "./node_modules/react/dist/react.js": "React",
  "./node_modules/react-dom/dist/react-dom.js": "ReactDOM",
  "./node_modules/lodash": "lodash"
}

顺便说一句,你也可以在你的配置中使用 browserify externals 来进一步减少生成的包。最好不要在你的包中包含例如:React。


注意:

我还在 Github 中向您发送了 PR 以寻求解决方案。

【讨论】:

    【解决方案2】:

    您的问题似乎是您将转译的代码作为您的库提供。转译的代码在内部包含 ReactMount。您应该提供用作库的源代码。然后它将使用 browserify 正确转换。查看任何其他 npm 库,我想您会看到它们提供了在您的导入中使用的源代码。

    正如您在评论中指出的那样。 @madox2 in Cannot import ES2015 module 回复了;

    "scripts": {
        "compile": "babel --presets es2015,stage-0 -d dist/js/ src/"
    }

    所以,npm install -g babel babel-preset-es2015 babel-preset-stage-0。然后 npm 运行编译。那应该将您的转译代码放入 dist/js。

    【讨论】:

    • 现在我真的很困惑;你能read this,请调整你的答案
    • 好的,我认为重要的一点是只使用 babel 而不是整个 browserify 构建。他给出了只使用命令行 babel 并将其应用于您的源代码的示例。
    • 你能在你的答案中添加一个示例 repo 吗?
    猜你喜欢
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多