在开发React
npm
模块期间,我将其与npm link
进行了符号链接。
执行此操作后,程序包将正确链接并显示在使用者应用程序node_modules
中。
该模块公开了一个界面来创建React
组件。因为我正在使用React
,jsx
和es2015
,所以我使用babel
在预发布阶段使用npm prepublish hook
转换我的模块代码
但是,当我尝试使用webpack
构建我的消费者应用程序时(即在链接之后),我的包中出现错误,说明:
模块构建失败:错误:找不到预设“es2015”
现在有趣的部分是,如果我在npm上发布包,然后从我的消费者应用程序中的注册表npm install
发布它,那么一切正常。
我尝试在我的消费者应用中安装babel-preset-es2015
,但之后就开始抱怨找不到babel
:
找不到模块:错误:无法解析模块'babel'
同样,如果我从npm注册表安装它,一切正常,在构建期间不会抛出任何错误。
我还尝试安装babel-core
,babel-cli
和babel-polyfill
,但都无济于事。
我在任何地方都使用babel v6.1.x
,并且知道所有最近的变化,但是我想我错过了一些明显的东西,如果有人可以帮助我,我会非常感激,因为不断发布模块以便测试是否有效的做法只是不好的做法。
为了完整起见,这里是代码:
以下是链接模块的步骤:
cd ~/Sites/me/react-leafbox
npm link
cd ~/Sites/me/mapp
npm link react-leafbox
npm start
构建后的堆栈跟踪:
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.6
和MAC OSX El Capitan v10.11.1
。我还尝试将node v4.2.1
与npm 2.14.7
一起使用,这给了我同样的错误。
答案 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文件作为内容是做什么的:
{ "预设":[ "反应" ] }