好的,因此在进行了更多研究之后,我偶然发现Lerna,这使我可以做我想做的事情(到目前为止,我所看到的)。它需要特定的项目树设置,如下所示:
project_root/ node_modules/ packages/ components/ // Components shared between projects components/ MyComponent.jsx index.jsx legacy/ output/ build.js // React 0.14 build node_modules/ package.json // project specific dependencies index.jsx // project specific entry .babelrc modern/ output/ build.js // React 16 build node_modules/ package.json // project specific dependencies index.jsx // project specific entry .babelrc package.json // contains devDependencies shared between projects lerna.json webpack.config.js index.html
然后,在components / index.jsx中,我根据全局变量指定了针对不同版本的require命令:
if(PROJECT_SRC == "legacy"){ React = require('../legacy/node_modules/react'); ReactDOM = require('../legacy/node_modules/react-dom');} else { React = require('../modern/node_modules/react'); ReactDOM = require('../modern/node_modules/react-dom');}注意:这可能是不好的做法,但是目前唯一的方式是我可以在构建中包含不同的React版本。在整个项目更改为该模型之后,我将不得不查看这种方法会出现什么问题。
在webpack.config.js中,我配置了两个导出-
一个用于现代,一个用于传统。每个都指向一个不同的入口index.jsx文件,使用webpack.DefinePlugin将全局变量设置为“旧版”或“现代”,并指定要解析的通用组件模块的路径:
['node_modules',path.resolve(__dirname, 'components')]
一个项目输出的webpack.config看起来像这样:
{ entry: "./packages/legacy/index.jsx", target: "web", output: { filename: "build.js", path: __dirname + "/packages/legacy/dist/", libraryTarget: "var", library: "lib_name" }, devtool: "source-map", resolve: { extensions: [".js", ".jsx", ".json"], modules: ['node_modules', path.resolve(__dirname, 'components')] }, plugins: plugins_legacy, module: { loaders: [ { test: /.jsx?$/, loader: "babel-loader", exclude: /node_modules/ } ] } }随时发表评论或指出问题,但我希望这对将来有所帮助!:)



