为核心和子模块应用程序构建的Webpack

问题描述:

我试图使用webpack构建一个应用程序,但发现一个问题。该应用程序的堆栈是React + Flux体系结构(ES6语法可用)和构建系统我使用的是webpack。我试图解决的问题是构建应用程序的系统的一个想法,该应用程序被分解为位于核心子目录内的核心模块和子模块。核心系统应该提供基本功能(如调度程序,基本的Flux操作和核心视图模块),插件应该能够导入核心功能来扩展应用程序。为核心和子模块应用程序构建的Webpack

当前构建解决方案允许我构建一个应用程序,但是我遇到了可能重复的模块问题。我创建了插件存储位于核心模块,并且还有registerPlugin动作,允许在核心内注册不同的模块。

核心模块具有插入index.js文件的入口点,我在此处导出可重用组件和操作(也用于注册插件)。

// core index.js 
export * as AppDispatcher from './src/dispatcher/AppDispatcher'; 
export BaseModel from './src/models/BaseModel'; 
export registerPlugin from './src/actions/registerPlugin'; 
// etc.. 

该文件导入各插件,给我访问这些模块。

// bootstrap plugin/entry point for plugin webpack 
import {registerPlugin} from 'core-module'; 

// plugin index.js 
require('./dist/plugin'); 

此外,每个插件公开index.js文件,该文件返回core的捆绑产品。然后核心简单地抓取该文件并在引导过程中导入它。

// bootstrap app/entry point for webpack 
import 'plugins/plugin-1'; 
import 'plugins/plugin-2'; 
... 

一切运作良好,但后来我发现(可能)依赖项重复的问题。当我试图从核心调试代码似乎插件存储,注册的行动正在被调用,但每个商店是不同的实例,所以基本上当我正在听核心模块中的商店更改我没有看到这种变化(因为一些不同的商店已经改变了,可能两个调度员在这里,也许两个动作......)。

这是循环依赖问题吗?有什么办法可以配置webpack,使其不会重复该操作?

另外值得一提的是,每个插件都有自己的webpack配置,它允许我为插件创建bundle,并且该bundle正在被核心模块抓取,然后webpack for core模块为整个应用程序创建bundle。

+0

什么是您的webpack插件?我知道如果添加webpack.optimize.DedupePlugin(),webpack将在可能的情况下去除您的捆绑代码。 –

+1

我试过使用DedupePlugin(创建dist版本时),但它没有帮助 – Kamil

为什么你不公开全局核心对象?
然后你可以使用ES6 destructuring来销毁它。
有些人可能会说全局变量是一个可怕的想法,不使用它们是ES6和commonJs模块背后的主要思想,它们是正确的,但在这种特殊情况下,将核心模块的主要功能作为单个对象公开不要暴露一切!)将会为您节省很多复杂的事情。

+0

另外我真的不知道你的确切webpack配置,所以这是我想到的第一件事。 – HosseinAgha