用于在node_modules中编译模块的Webpackconfiguration

我的webpack / babelconfiguration有问题。 我已经安装我的组件库(es6模块没有webpackconfiguration里面)作为node_module。 而在这种情况下,它不工作 – 我得到了'意外的令牌导入'错误(巴贝尔不会esp代码esp)

但是,如果我将外部文件夹链接到node_modules(npm链接./../../component-repository),那么它工作正常,没有任何错误。 我花了很多时间,仍然无法解决这个问题。

主要问题是如何在各个项目之间共享反应组分。 我的想法是将它们添加为依赖项。

编辑:如何设置webpack&babel项目从node_modules文件夹编译ES6模块? npm链接到兄弟文件夹的解决scheme不适用于生产。

编辑2:为什么我保持在模块es6代码的原因是,在本地环境我想npm链接兄弟文件夹与组件(我可以编辑组件,然后提交更改到他们的存储库)。 我共享3个项目之间的组件。 但在生产中,我想从git仓库自动安装它们作为依赖

本地环境的结构:

  • 组件(也是独立的git仓库)
  • PROJECT1
    • node_modules
    • 组件(从../../components链接)
  • 项目2
    • node_modules
    • 组件(从../../components链接)

生产结构:

  • PROJECT1
    • node_modules
    • 组件(作为从Git仓库的依赖)

后期,但我今天遇到了这个确切的情况。 对我来说,这个问题是由babel require hook造成的:

https://babeljs.io/docs/usage/require/

注:默认情况下,所有对node_modules的要求都将被忽略。

基本上,巴贝尔没有被用于任何需要指向node_modules。 这就是为什么代码工作的NPM链接模块,我猜巴贝尔跳过忽略,因为path不包含node_modules。

我可以通过改变require hook中的忽略逻辑来解决这个问题,就像这样:

 require('babel-register')({ extensions: [".es6", ".es", ".jsx", ".js"], ignore: (absPath) => { if (absPath.lastIndexOf('node_modules') > absPath.indexOf('es6_module')) { return true; } else if (absPath.indexOf('es6_module') > -1) { return false; } else if (absPath.indexOf('node_modules') > -1) { return true; } return false; } }); 

当然,确保你的加载器有相同的逻辑:

 loaders: [ { test: /\.jsx?$/, exclude: (absPath) => { if (absPath.lastIndexOf('node_modules') > absPath.indexOf('es6_module')) { return true; } else if (absPath.indexOf('es6_module') > -1) { return false; } else if (absPath.indexOf('node_modules') > -1) { return true; } return false; } loader: 'babel', query: { cacheDirectory: true, presets: ['es2015', 'react'] } } 

您是否安装了es2015预设?

 npm install babel-preset-es2015 

第一select

loader可能看起来像这样:

 loaders: [ { test: /\.jsx?$/, exclude: /bower_components/, loader: 'babel', query: { cacheDirectory: true, presets: ['es2015', 'react'] } } 

这个加载器应该通过你所有的模块(但是要注意:也是通过所有的node_modules)并且编译它们。 预设的es2015正在pipe理您的ES6语法并将其转换为es5。

第二个选项

将自己的节点模块安装到自己的目录中

 mkdir -p ./install/here/own_packages npm install --prefix ./install/here <package> 

所以你可以在你的webpack.config中做到这一点

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

在那里,node_modules文件夹(和bower_components)内的所有文件都被忽略。 你可以使用上面的命令行在src/js/components (或任何地方)安装自己的npm模块。

许多用作依赖关系的项目 npm发布之前确保编译成ES5。

这对于几个原因是有用的。

  1. 代码可以简单地通过<script>添加到Web浏览器中,并且可以工作
  2. 它不会推断消费应用程序将使用的捆绑工具

实现这一目标的一种方法是在发布到npm之前将库代码通过babel。

设置时,我从React Bootstrap项目中获得灵感。 但那主要是因为我们想要构build便携式,风格化的组件。 然而,他们设置图书馆的方式是相当不错的国际海事组织。

像这样设置之后,消费应用程序的configuration非常简单,因为没有babel编译工作。 模块捆绑器(就像webpack)可以捆绑模块(就像其他node_modules依赖)。