Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Vue-CLI Production Error #67

Closed
dirodriguezm opened this issue Jul 18, 2021 · 7 comments
Closed

Vue-CLI Production Error #67

dirodriguezm opened this issue Jul 18, 2021 · 7 comments

Comments

@dirodriguezm
Copy link

Hello, I think I always ask stuff that are not really a bug with the library, but I don't know where to ask. So I apologize if this is too dumb.

I'm trying to build a vue app for production. The documentation says that I have to configure Terser plugin so I did. Put this inside vue.config.js

  const TerserPlugin = require("terser-webpack-plugin");
  module.exports = {
  //... other configs
    configureWebpack: (config) => {
      config.optimization = {
        minimize: true,
        minimizer: [
          new TerserPlugin({
            terserOptions: {
              keep_classnames: true,
              keep_fnames: true,
            },
          }),
        ],
      };
    },
  }

But I still get a blank page after building and the following error:

Uncaught TypeError: o is undefined
    generateIdName id.helper.js:19
    cleanParameter parameters.helper.js:26
    injectParameterDecorator inject.helper.js:41
    inject inject.helper.js:21
    __param tslib.es6.js:61
    DecorateConstructor Reflect.js:541
    decorate Reflect.js:130
    __decorate tslib.es6.js:55
    f112 HttpService.ts:53
    Webpack 5
        __webpack_require__
        0
        __webpack_require__
        <anonymous>
        <anonymous>

Note: Before I configured TerserPlugin the error was a bit different. It said TypeError: e is undefined
Note2: It works completely fine in development mode

@CKGrafico
Copy link
Owner

Something is wrong in your config, is not working when you're doing the minification, I'll need a sandobx project to test

@dirodriguezm
Copy link
Author

@CKGrafico Ok, thanks. Right now I'm on a short holiday. I'll get back to it next week and might create a sandbox for yout to test.

@dirodriguezm
Copy link
Author

Hi again !

I tried to recreate the problem starting from a clean project but it worked fine. I'm sure there's a problem with my project, but unfortunately I can't make a sandbox with it. I can report back some progress though.

After carefully checking my tsconfig.json and refactoring a few classes I got to a point where I'm absolutely sure that there is a problem with bindings when running in production mode that does not happen on dev.

For example, there's a Vuex action that gets an instance from the container like this:

login() {
  const interactor = container.get<UseCaseInteractor>(cid.Login)
  interactor.execute()
}

Which results in the following error: Uncaught (in promise) Error: No matching bindings found for serviceIdentifier: Symbol(I)

In the part that I inject all dependencies I have this:

export function containerBuilder(): void {
  container.addSingleton<UseCaseInteractor>(Login);
}

This works fine on development mode but not when I build the project.

I'm using vue cli. On development mode I use vue-cli-service serve and for production I'm running vue-cli-service build.

@CKGrafico
Copy link
Owner

That means you're minifiying the code without:

  keep_classnames: true,
              keep_fnames: true,

these options are only to don't have Symbol(I)

@dirodriguezm
Copy link
Author

dirodriguezm commented Jul 27, 2021

@CKGrafico Ok, so I changed the webpack config inside my vue.config.js like this:

  configureWebpack: (config) => {
    config.optimization = {
      minimize: false, // <--- changed this to false
      minimizer: [
        new TerserPlugin({
          terserOptions: {
            keep_classnames: true,
            keep_fnames: true,
          },
        }),
      ],
    };
  },

Setting minimize option to false and got it working, so that's great. But what does this mean really ?
Is this the default or am I changing something that should not be changed ?
I thought that for the minimizer property to work I should have minimize set to true

Edit: vue inspect shows the following optimization options:

  optimization: {
    minimize: true,
    minimizer: [
      {
        options: {
          test: /\.m?js(\?.*)?$/i,
          chunkFilter: () => true,
          warningsFilter: () => true,
          extractComments: true,
          sourceMap: undefined,
          cache: true,
          cacheKeys: defaultCacheKeys => defaultCacheKeys,
          parallel: true,
          include: undefined,
          exclude: undefined,
          minify: undefined,
          terserOptions: {
            keep_classnames: true,
            keep_fnames: true
          }
        }
      }
    ]
  },

Printing the options on build step also shows correct value for keep_classnames and keep_fnames. What could be causing the error even if the setup is correct for minimizer ?

@CKGrafico
Copy link
Owner

No idea, never happened to me, if you create a project form scratch is also happening? if you use another minimizer instead Terser is also happening?

@dirodriguezm
Copy link
Author

I created a project from scratch and worked totally fine. I also tried to match the dependencies from the working and not working projects but no luck. I guess I will have to not use minimizer or try with another instead of Terser.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants