CrackerakiUA/ngImgCropFullExtended

Webpack compatibility

Opened this issue · 7 comments

I'm migrating an app from bower to webpack, and I'm struggling on this lib.

I know it is no more maintained, and I have already checked the existing issue (especially the #104), but I'm trying the proposed solution, it doesn't work.

I'm opening this issue in order to build, with your help if you'd like, a working config that anyone coming with Webpack can use.

As of now, I have installed the imports-loader and added it to my webpack config

Disclaimer: I'm migrating a Rails application, so I'm using the Webpacker gem to do so, which explain the files architecture.

Here is my config/webpack/environment.js file :

const path = require('path')
const webpack = require('webpack')

const { environment } = require('@rails/webpacker')

environment.plugins.append('Provide', new webpack.ProvidePlugin({
  $: 'jquery',
  jQuery: 'jquery',
  moment: 'moment',
  ...
}))

environment.loaders.append('ng-img-crop-full-extended', {
  test: require.resolve('ng-img-crop-full-extended'),
  use: 'imports-loader?define=>false,exports=>false'
})

environment.loaders.append('js', { test: /\.js$/,
  exclude: /node_modules/,
  use: [
    {
      // Auto require AngularJS 1.x templates in Webpack style
      // (See https://github.com/YashdalfTheGray/auto-ngtemplate-loader)
      loader: 'auto-ngtemplate-loader'
    },
    {
      // Require a whole directory of trees in bulk (I.e: `//@require ...`)
      // (See https://github.com/shanhaichik/webpack-require-loader)
      loader: 'required-loader',
      options: {
        import: ['angular']
      }
    }
  ]
})

environment.loaders.append('html', { test: /\.html$/,
  exclude: /node_modules/,
  use: [
    {
      // Include AngularJS templates in the Webpack bundle and preload the template cache.
      // (See https://github.com/WearyMonkey/ngtemplate-loader)
      loader: 'ngtemplate-loader',
      options: {
        relativeTo: 'javascript/'
      }
    },
    {
      loader: 'html-loader'
    }
  ]
})

environment.loaders.append('img', {
  test: /\.(jpe?g|png|gif|svg|ico)$/i,
  use: ['file-loader']
})

module.exports = environment

The webpack compilation is working fine, but in my app when I'm using the crop (which looks like working on the page), I have the following error in my console :

ReferenceError: ColorThief is not defined
    at Object.getDominantColor (ng-img-crop.js:3058)
    at updateResultImage (ng-img-crop.js:3273)
    at ng-img-crop.js:3385
    at ng-img-crop.js:3318
    at Scope.$eval (angular.js:18134)
    at Scope.$apply (angular.js:18238)
    at ng-img-crop.js:3317
    at angular.js:20097
    at completeOutstandingRequest (angular.js:6066)
    at angular.js:6350

Looking a bit further in the source code of this library, I saw that to get the module exported with module.exports I need to have define to false and exports === 'object' so I'm then trying to change the params like the following :

environment.loaders.append('ng-img-crop-full-extended', {
  test: require.resolve('ng-img-crop-full-extended'),
  use: 'imports-loader?define=>false,exports=>"object"'
})

But still the same 😞 (and I'm restarting webpack each time).

Can you please guide me own order to get it working please ?

Thank you !

I don't have experience with webpack on the level to help you with this :(

Thank you @CrackerakiUA for your comment.

@ybian you seem to had a working webpack import. I tried your solution but didn't work for me. Do you have a working Webpack 4 way please?

@CrackerakiUA what are you using instead of Webpack?

In fact currently I am using Webpack with use of Angular 7, I am not longer working with Angular 1. When I was using Angular 1, I was simply working with it without Webpack

Well I'm using Webpack 4 as described in my issue so can you please help me ? :)

I have like 0 experience with it, Angular 7 all config for that

I see, thank you.