speed-measure-webpack-plugin icon indicating copy to clipboard operation
speed-measure-webpack-plugin copied to clipboard

conflict with add-asset-html-webpack-plugin package

Open GoToBoy opened this issue 6 years ago • 5 comments

both use speed-measure and add-asset-html , would cause

compiling Cannot read property 'toPromise' of undefined

i don't know why ,

GoToBoy avatar Oct 31 '19 06:10 GoToBoy

image

GoToBoy avatar Oct 31 '19 12:10 GoToBoy

Is this problem has been solved?

darrell0904 avatar Feb 21 '20 14:02 darrell0904

No, I've not had a chance to look at this issue yet @darrell0904 - I would appreciate any PRs!

stephencookdev avatar Feb 22 '20 16:02 stephencookdev

在我的项目中我解决了该问题.

该问题的原因是由于, smp在每次webpack插件调用时, compiler, compilation中的hooks对象都返回一个新的, 代码:

const wrapped = Object.keys(hooks).reduce((acc, method) => {
    acc[method] = genProxy(method);
    return acc;
  }, {});

这会导致在某个插件中对hooks添加一个新的hook, 但由于hooks是smp返回的一个新的对象, 对其设置的新的hook在其他的插件都获取不到(不同同一个对象), 因此解决方案是hooks返回原有对象, 不要创建新的对象, 比较小的改动为:

  const wrapped = Object.keys(hooks).reduce((acc, method) => {
    acc[method] = genProxy(method);
    return acc;
  }, hooks);

也可以使用Proxy代理:

const wrapped = new Proxy(hooks, {
    get(target, property) {
      if (!target[property]) {
        return target[property];
      }
      return genProxy(property)
    },
    set: (target, property, value) => {
      return Reflect.set(target, property, value);
    },
    deleteProperty: (target, property) => {
      return Reflect.deleteProperty(target, property);
    },
  });

这样就可以在vue-cli@3, vue-cli@4中使用了, 和使用html-webpack-plugin系列插件中使用了.

English is not good. Here is Google translation.

I solved the problem in my project.

The reason for this problem is that every time SMP calls the webpack plug-in, the "hooks" object in the "compiler" and "compilation" returns a new one, Code:

const wrapped = Object.keys(hooks).reduce((acc, method) => {
    acc[method] = genProxy(method);
    return acc;
  }, {});

This will cause a new hook to be added to hooks in a plug-in, but because hooks is a new object returned by SMP, the new hook set to it cannot be obtained by other plug-ins (different from the same object), so the solution is that hooks returns the original object, do not create a new object, the smaller change is

  const wrapped = Object.keys(hooks).reduce((acc, method) => {
    acc[method] = genProxy(method);
    return acc;
  }, hooks);

it is recommended to use a 'proxy' proxy

const wrapped = new Proxy(hooks, {
    get(target, property) {
      if (!target[property]) {
        return target[property];
      }
      return genProxy(property)
    },
    set: (target, property, value) => {
      return Reflect.set(target, property, value);
    },
    deleteProperty: (target, property) => {
      return Reflect.deleteProperty(target, property);
    },
  });

In this way, it can be used in 'vue-cli @ 3', 'vue-cli @ 4', and use 'HTML webpack plugin' series plug-ins

joyerli avatar Mar 27 '20 07:03 joyerli

Is there any plan to fix this problem?

yft avatar Jul 01 '21 12:07 yft