使用npm链接进行Symlinking反应模块以进行本地开发会产生错误

时间:2015-11-14 17:57:16

标签: node.js reactjs npm webpack babeljs

在开发React npm模块期间,我将其与npm link进行了符号链接。 执行此操作后,程序包将正确链接并显示在使用者应用程序node_modules中。

该模块公开了一个界面来创建React组件。因为我正在使用Reactjsxes2015,所以我使用babel在预发布阶段使用npm prepublish hook转换我的模块代码

但是,当我尝试使用webpack构建我的消费者应用程序时(即在链接之后),我的包中出现错误,说明:

  

模块构建失败:错误:找不到预设“es2015”

现在有趣的部分是,如果我在npm上发布包,然后从我的消费者应用程序中的注册表npm install发布它,那么一切正常。

我尝试在我的消费者应用中安装babel-preset-es2015,但之后就开始抱怨找不到babel

  

找不到模块:错误:无法解析模块'babel'

同样,如果我从npm注册表安装它,一切正常,在构建期间不会抛出任何错误。

我还尝试安装babel-corebabel-clibabel-polyfill,但都无济于事。

我在任何地方都使用babel v6.1.x,并且知道所有最近的变化,但是我想我错过了一些明显的东西,如果有人可以帮助我,我会非常感激,因为不断发布模块以便测试是否有效的做法只是不好的做法。

为了完整起见,这里是代码:

以下是链接模块的步骤:

  1. cd ~/Sites/me/react-leafbox
  2. npm link
  3. cd ~/Sites/me/mapp
  4. npm link react-leafbox
  5. npm start
  6. 构建后的堆栈跟踪:

    ERROR in ../react-leafbox/lib/index.js
    Module build failed: Error: Couldn't find preset "es2015"
        at OptionManager.mergePresets (/Users/daniel/Sites/me/mapp/node_modules/babel-core/lib/transformation/file/options/option-manager.js:329:17)
        at OptionManager.mergeOptions (/Users/daniel/Sites/me/mapp/node_modules/babel-core/lib/transformation/file/options/option-manager.js:289:12)
        at OptionManager.addConfig (/Users/daniel/Sites/me/mapp/node_modules/babel-core/lib/transformation/file/options/option-manager.js:223:10)
        at OptionManager.findConfigs (/Users/daniel/Sites/me/mapp/node_modules/babel-core/lib/transformation/file/options/option-manager.js:366:16)
        at OptionManager.init (/Users/daniel/Sites/me/mapp/node_modules/babel-core/lib/transformation/file/options/option-manager.js:410:12)
        at File.initOptions (/Users/daniel/Sites/me/mapp/node_modules/babel-core/lib/transformation/file/index.js:191:75)
        at new File (/Users/daniel/Sites/me/mapp/node_modules/babel-core/lib/transformation/file/index.js:122:22)
        at Pipeline.transform (/Users/daniel/Sites/me/mapp/node_modules/babel-core/lib/transformation/pipeline.js:42:16)
        at transpile (/Users/daniel/Sites/me/mapp/node_modules/babel-loader/index.js:14:22)
        at Object.module.exports (/Users/daniel/Sites/me/mapp/node_modules/babel-loader/index.js:83:14)
     @ ./src/js/components/App.jsx 2:10-34
    

    添加额外的与babel相关的依赖项后的堆栈跟踪(我认为这不应该是必需的,因为它们在react-leafbox模块中可用):

    ERROR in ../react-leafbox/lib/index.js
    Module not found: Error: Cannot resolve module 'babel' in /Users/daniel/Sites/me/react-leafbox/lib
     @ ../react-leafbox/lib/index.js 8:11-39
    

    我在node v5.0.0上使用npm v3.3.6MAC OSX El Capitan v10.11.1。我还尝试将node v4.2.1npm 2.14.7一起使用,这给了我同样的错误。

4 个答案:

答案 0 :(得分:22)

我找到了解决问题的方法。我在webpack docs中发现了这个:

  

重要提示:此处的加载器是相对于资源解析的   它们适用于哪些。这意味着他们没有相对解决   配置文件。如果您从npm安装了加载器   您的node_modules文件夹不在所有源的父文件夹中   文件,webpack找不到加载器。你需要添加   node_modules文件夹作为resolveLoader.root选项的绝对路径。   (resolveLoader:{root:path.join(__ dirname,“node_modules”)})

root选项添加到webpack.config.js后,有关无法解决babel的错误消失了。相反,我得到一个新的说它无法解决react。我将它定义为对等依赖项,这让我认为当它无法在本地找到它时需要回退,然后我在docs中找到了它:

  

resolve.fallback目录(或目录绝对路径数组),   其中webpack应该查找未找到的模块   resolve.root或resolve.modulesDirectories。

我将这两个选项合并到我的消费者应用的webpack.config.js中,并且有效!

// webpack.config.js
var path = require('path');

module.exports = {

    entry: path.resolve(__dirname, 'src/js/index.js'),

    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: "build.js"
    },

    module: {
        loaders: [
            {
                test: /\.jsx?$/,
                exclude: /(node_modules)/,
                loader: 'babel',
                query:
                    {
                        presets:[ 'react', 'es2015' ]
                    }
            }
        ]
    },

    resolve: {
        extensions: [ '', '.js', '.jsx' ],
        fallback: path.join(__dirname, "node_modules")
    },


    resolveLoader: {
        root: path.join(__dirname, "node_modules")
    }
};

我希望这有助于任何遇到类似问题的人。

更新Webpack ^ 2.5.0

删除resolveLoader对象,将resolve.fallback替换为设置为resolve.symlinks的{​​{1}}:

false

答案 1 :(得分:0)

也许这只是一个拼写错误但它应该是babel-preset-es2015而不是babel-preset-2015。 npm install babel-preset-es2015。

答案 2 :(得分:0)

我遇到了这个问题,当我需要使用npm install webpack webpack-dev-server --save-dev

将其安装到我的应用目录时,我已全局安装了

答案 3 :(得分:0)

我在尝试设置路由器演示时遇到了这个问题:https://github.com/reactjs/react-router-tutorial/tree/master/lessons/01-setting-up

这里的所有解决方案对我来说都不起作用,但是添加.babelrc文件作为内容是做什么的:

{     "预设":[         "反应"     ] }