jQWidgets Forums

jQuery UI Widgets Forums React webpack fails while making a npm run-script build proccess

This topic contains 1 reply, has 2 voices, and was last updated by  Hristo 6 years, 2 months ago.

Viewing 2 posts - 1 through 2 (of 2 total)
  • Author

  • assembler
    Participant

    I have a React project running over React Boilerplate 3.7.0 and this is my package.json:

    
    {
      "name": "react-boilerplate",
      "version": "3.7.0",
      "description": "A highly scalable, offline-first foundation with the best DX and a focus on performance and best practices",
      "repository": {
        "type": "git",
        "url": "git://github.com/react-boilerplate/react-boilerplate.git"
      },
      "engines": {
        "npm": ">=5",
        "node": ">=8.10.0"
      },
      "author": "Max Stoiber",
      "license": "MIT",
      "scripts": {
        "analyze:clean": "rimraf stats.json",
        "preanalyze": "npm run analyze:clean",
        "analyze": "node ./internals/scripts/analyze.js",
        "extract-intl": "node ./internals/scripts/extract-intl.js",
        "npmcheckversion": "node ./internals/scripts/npmcheckversion.js",
        "preinstall": "npm run npmcheckversion",
        "prebuild": "npm run build:clean",
        "build": "cross-env NODE_ENV=production webpack --config internals/webpack/webpack.prod.babel.js --color -p --progress --hide-modules --display-optimization-bailout",
        "build:clean": "rimraf ./build",
        "start": "cross-env NODE_ENV=development env-cmd .env node server",
        "start:tunnel": "cross-env NODE_ENV=development ENABLE_TUNNEL=true node server",
        "start:production": "npm run test && npm run build && npm run start:prod",
        "start:prod": "cross-env NODE_ENV=production node server",
        "presetup": "npm i chalk shelljs",
        "setup": "node ./internals/scripts/setup.js",
        "clean": "shjs ./internals/scripts/clean.js",
        "clean:all": "npm run analyze:clean && npm run test:clean && npm run build:clean",
        "generate": "plop --plopfile internals/generators/index.js",
        "lint": "npm run lint:js",
        "lint:css": "stylelint './app/**/*.js'",
        "lint:eslint": "eslint --ignore-path .gitignore --ignore-pattern internals/scripts",
        "lint:eslint:fix": "eslint --ignore-path .gitignore --ignore-pattern internals/scripts --fix",
        "lint:js": "npm run lint:eslint -- . ",
        "lint:staged": "lint-staged",
        "pretest": "npm run test:clean && npm run lint",
        "test:clean": "rimraf ./coverage",
        "test": "cross-env NODE_ENV=test jest --coverage",
        "test:watch": "cross-env NODE_ENV=test jest --watchAll",
        "coveralls": "cat ./coverage/lcov.info | coveralls",
        "prettify": "prettier --write"
      },
      "lint-staged": {
        "*.js": [
          "npm run lint:eslint:fix",
          "git add --force"
        ],
        "*.json": [
          "prettier --write",
          "git add --force"
        ]
      },
      "pre-commit": "lint:staged",
      "resolutions": {
        "babel-core": "7.0.0-bridge.0"
      },
      "dependencies": {
        "@coreui/coreui": "^2.1.4",
        "@coreui/coreui-plugin-chartjs-custom-tooltips": "^1.2.0",
        "@coreui/icons": "^0.3.0",
        "@coreui/react": "^2.1.1",
        "ajv": "^6.6.1",
        "babel-polyfill": "^6.26.0",
        "block-ui": "^2.70.1",
        "bootstrap": "^4.1.3",
        "chalk": "^2.4.1",
        "chart.js": "^2.7.3",
        "classnames": "^2.2.6",
        "compression": "^1.7.3",
        "connected-react-router": "^4.5.0",
        "core-js": "^2.6.0",
        "env-cmd": "^8.0.2",
        "exports-loader": "^0.7.0",
        "flag-icon-css": "^3.2.1",
        "font-awesome": "^4.7.0",
        "fontfaceobserver": "2.0.13",
        "history": "^4.7.2",
        "hoist-non-react-statics": "3.0.1",
        "immutable": "^3.8.2",
        "intl": "^1.2.5",
        "invariant": "^2.2.4",
        "ip": "^1.1.5",
        "is-url-external": "^1.0.3",
        "isnumeric": "^0.3.3",
        "jquery": "^3.3.1",
        "jqwidgets-scripts": "^6.2.0",
        "loadable-components": "^2.2.3",
        "lodash": "^4.17.11",
        "minimist": "1.2.0",
        "moment": "^2.22.2",
        "numeral": "^2.0.6",
        "prop-types": "^15.6.2",
        "react": "^16.6.3",
        "react-chartjs-2": "^2.7.4",
        "react-dom": "^16.6.3",
        "react-helmet": "^5.2.0",
        "react-hot-loader": "^4.6.3",
        "react-intl": "^2.7.2",
        "react-loadable": "^5.5.0",
        "react-redux": "^5.1.1",
        "react-router-dom": "^4.3.1",
        "react-sizeme": "^2.5.2",
        "reactstrap": "^6.5.0",
        "redux": "^4.0.1",
        "redux-immutable": "^4.0.0",
        "redux-saga": "^0.16.2",
        "reselect": "4.0.0",
        "resize-sensor": "0.0.6",
        "sanitize.css": "4.1.0",
        "simple-line-icons": "^2.4.1",
        "styled-components": "^4.1.2",
        "warning": "^4.0.2"
      },
      "devDependencies": {
        "@babel/cli": "7.1.2",
        "@babel/core": "7.1.2",
        "@babel/plugin-proposal-class-properties": "7.1.0",
        "@babel/plugin-proposal-export-namespace-from": "^7.2.0",
        "@babel/plugin-syntax-dynamic-import": "7.0.0",
        "@babel/plugin-transform-modules-commonjs": "7.1.0",
        "@babel/plugin-transform-react-constant-elements": "7.0.0",
        "@babel/plugin-transform-react-inline-elements": "7.0.0",
        "@babel/polyfill": "^7.0.0",
        "@babel/preset-env": "7.1.0",
        "@babel/preset-react": "7.0.0",
        "@babel/register": "7.0.0",
        "add-asset-html-webpack-plugin": "3.1.1",
        "babel-core": "7.0.0-bridge.0",
        "babel-eslint": "10.0.1",
        "babel-loader": "8.0.4",
        "babel-plugin-dynamic-import-node": "2.2.0",
        "babel-plugin-lodash": "3.3.4",
        "babel-plugin-react-intl": "3.0.1",
        "babel-plugin-react-transform": "3.0.0",
        "babel-plugin-styled-components": "1.8.0",
        "babel-plugin-transform-react-remove-prop-types": "0.4.19",
        "circular-dependency-plugin": "5.0.2",
        "compare-versions": "3.4.0",
        "compression-webpack-plugin": "2.0.0",
        "copy-webpack-plugin": "^4.6.0",
        "coveralls": "3.0.2",
        "cross-env": "^5.2.0",
        "css-loader": "1.0.0",
        "enzyme": "3.7.0",
        "enzyme-adapter-react-16": "1.6.0",
        "enzyme-to-json": "3.3.4",
        "eslint": "5.7.0",
        "eslint-config-airbnb": "17.1.0",
        "eslint-config-airbnb-base": "13.1.0",
        "eslint-config-prettier": "3.1.0",
        "eslint-import-resolver-webpack": "0.10.1",
        "eslint-plugin-import": "^2.14.0",
        "eslint-plugin-jsx-a11y": "6.1.2",
        "eslint-plugin-prettier": "3.0.0",
        "eslint-plugin-react": "7.11.1",
        "eslint-plugin-redux-saga": "0.9.0",
        "express": "^4.16.4",
        "file-loader": "2.0.0",
        "html-loader": "0.5.5",
        "html-webpack-plugin": "3.2.0",
        "http-proxy-middleware": "^0.19.1",
        "image-webpack-loader": "^4.6.0",
        "imports-loader": "0.8.0",
        "jest-cli": "23.6.0",
        "jest-styled-components": "6.2.2",
        "lint-staged": "7.3.0",
        "ngrok": "3.1.0",
        "node-plop": "0.16.0",
        "node-sass": "^4.11.0",
        "null-loader": "0.1.1",
        "offline-plugin": "5.0.5",
        "optimize-css-assets-webpack-plugin": "^5.0.1",
        "plop": "2.1.0",
        "pre-commit": "1.2.2",
        "prettier": "1.14.3",
        "react-app-polyfill": "0.1.3",
        "react-test-renderer": "16.6.0",
        "rimraf": "2.6.2",
        "sass-loader": "^7.1.0",
        "shelljs": "^0.8.3",
        "style-loader": "0.23.1",
        "stylelint": "9.6.0",
        "stylelint-config-recommended": "2.1.0",
        "stylelint-config-styled-components": "0.1.1",
        "stylelint-processor-styled-components": "1.5.0",
        "svg-url-loader": "2.3.2",
        "terser-webpack-plugin": "1.1.0",
        "uglifyjs-webpack-plugin": "^2.0.1",
        "url-loader": "1.1.2",
        "webpack": "^4.27.1",
        "webpack-cli": "^3.1.2",
        "webpack-dev-middleware": "3.4.0",
        "webpack-hot-middleware": "2.24.3 ",
        "webpack-pwa-manifest": "3.7.1",
        "whatwg-fetch": "3.0.0"
      }
    }
    
    

    As you can see I’m using React 16.6 and jqwidgets-scripts 6.2. My project takes advantage on the Boilerplate scaffold, that is to say I’m using the default webpack 4 configuration that comes out of the box with the React Boilerplate, due to in https://www.jqwidgets.com/reactjs-components-documentation/documentation/webpack_react/index.htm?search= you say “All Webpack’s configuration may vary based on your application needs.”.

    My webpack.base.babel.js was modified with the fallowing code:

    ...
    module: {
        rules: [
          {
            test: /\.js$|\.jsx$/, // Transform all .js files required somewhere with Babel
            exclude: /node_modules\/(?!(jqwidgets-scripts\/jqwidgets-react)\/).*/,
            use: {
              loader: 'babel-loader',
              options: options.babelQuery,
            },
          },
        ...
       ]
       ...
    }
    

    with that regular expression I’m excluding node_models but including jqwidgets-scripts/jqwidgets-react. If I run npm start it works perfectly, but if I run npm run-script build or npm run build it crashes the webpack compiler with this:

    > react-boilerplate@3.7.0 prebuild /home/my_user_name/my_project
    > npm run build:clean
    
    > react-boilerplate@3.7.0 build:clean /home/my_user_name/my_project
    > rimraf ./build
    
    > react-boilerplate@3.7.0 build /home/my_user_name/my_project
    > cross-env NODE_ENV=production webpack --config internals/webpack/webpack.prod.babel.js --color -p --progress --hide-modules --display-optimization-bailout
    
    Hash: 7b0feef0f8bbac0c9421                                                           
    Version: webpack 4.27.1
    Time: 42059ms
    Built at: 2019-01-24 10:15:26
     251 assets
    Entrypoint main = runtime~main.43b100be02c6a9dbfc5a.js vendor.4d1e1f30cd3a7c98cfd8.chunk.js main.5ce13ffd96704eeb6b0d.chunk.js
    
    ERROR in ./node_modules/jqwidgets-scripts/jqwidgets-react/react_jqxgrid.js 1216:12
    Module parse failed: Unexpected token (1216:12)
    You may need an appropriate loader to handle this file type.
    |     render() {
    |         return (
    >             <div id={this.state.id}>{this.props.value}{this.props.children}</div>
    |         )
    |     };
     @ ./app/modules/My_module_1/index.js 44:0-70 1196:53-60 1256:37-44 1267:37-44 1277:37-44
     @ ./app/modules/My_module_2/Loadable.js
     @ ./app/modules/My_module_3/_nav.js
     @ ./app/modules/My_module_4/index.js
     @ ...
     @ ./app/app.js
     @ multi ./node_modules/react-app-polyfill/ie11.js ./app/app.js
    
    ...

    Also, I followed https://www.jqwidgets.com/community/topic/webpack-module-parse-failed/ and I made some changes to the configuration like this:

    `{
    test: /\.js$|\.jsx$/,
    exclude: ‘/node_modules’,
    include: ‘/jqwidgets-scripts/jqwidgets-react’,
    use: {
    loader: ‘babel-loader’,
    options: options.babelQuery
    }
    },
    …`

    Then if I run npm start it says:

    
    webpack built be60767d46a99fe48e6b in 1389ms
    ✖ 「wdm」: 
    ERROR in ./app/app.js 80:4
    Module parse failed: Unexpected token (80:4)
    You may need an appropriate loader to handle this file type.
    | const render = messages => {
    |   ReactDOM.render(
    >     <AppContainer>
    |       <Provider store={store}>
    |         <LanguageProvider messages={messages}>
     @ multi ./node_modules/react-app-polyfill/ie11.js webpack-hot-middleware/client?reload=true ./app/app.js main[2]

    My webpack.prod.babel.js is this:

    // Important modules this config uses
    const path = require('path');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    const WebpackPwaManifest = require('webpack-pwa-manifest');
    const OfflinePlugin = require('offline-plugin');
    const { HashedModuleIdsPlugin } = require('webpack');
    const TerserPlugin = require('terser-webpack-plugin');
    const CompressionPlugin = require('compression-webpack-plugin');
    
    module.exports = require('./webpack.base.babel')({
      mode: 'production',
    
      // In production, we skip all hot-reloading stuff
      entry: [
        require.resolve('react-app-polyfill/ie11'),
        path.join(process.cwd(), 'app/app.js'),
      ],
    
      // Utilize long-term caching by adding content hashes (not compilation hashes) to compiled assets
      output: {
        filename: '[name].[chunkhash].js',
        chunkFilename: '[name].[chunkhash].chunk.js',
      },
    
      optimization: {
        minimize: true,
        minimizer: [
          new TerserPlugin({
            terserOptions: {
              warnings: false,
              compress: {
                comparisons: false,
              },
              parse: {},
              mangle: true,
              output: {
                comments: false,
                ascii_only: true,
              },
            },
            parallel: true,
            cache: true,
            sourceMap: true,
          }),
        ],
        nodeEnv: 'production',
        sideEffects: true,
        concatenateModules: true,
        splitChunks: {
          chunks: 'all',
          minSize: 30000,
          minChunks: 1,
          maxAsyncRequests: 5,
          maxInitialRequests: 3,
          name: true,
          cacheGroups: {
            commons: {
              test: /[\\/]node_modules[\\/]/,
              name: 'vendor',
              chunks: 'all',
            },
            main: {
              chunks: 'all',
              minChunks: 2,
              reuseExistingChunk: true,
              enforce: true,
            },
          },
        },
        runtimeChunk: true,
      },
    
      plugins: [
        // Minify and optimize the index.html
        new HtmlWebpackPlugin({
          template: 'app/index.html',
          minify: {
            removeComments: true,
            collapseWhitespace: true,
            removeRedundantAttributes: true,
            useShortDoctype: true,
            removeEmptyAttributes: true,
            removeStyleLinkTypeAttributes: true,
            keepClosingSlash: true,
            minifyJS: true,
            minifyCSS: true,
            minifyURLs: true,
          },
          inject: true,
        }),
    
        // Put it in the end to capture all the HtmlWebpackPlugin's
        // assets manipulations and do leak its manipulations to HtmlWebpackPlugin
        new OfflinePlugin({
          relativePaths: false,
          publicPath: '/',
          appShell: '/',
    
          // No need to cache .htaccess. See http://mxs.is/googmp,
          // this is applied before any match in <code>caches</code> section
          excludes: ['.htaccess'],
    
          caches: {
            main: [':rest:'],
    
            // All chunks marked as <code>additional</code>, loaded after main section
            // and do not prevent SW to install. Change to <code>optional</code> if
            // do not want them to be preloaded at all (cached only when first loaded)
            additional: ['*.chunk.js'],
          },
    
          // Removes warning for about <code>additional</code> section usage
          safeToUseOptionalCaches: true,
        }),
    
        new CompressionPlugin({
          algorithm: 'gzip',
          test: /\.js$|\.css$|\.html$/,
          threshold: 10240,
          minRatio: 0.8,
        }),
    
        new WebpackPwaManifest({
          name: 'React Boilerplate',
          short_name: 'React BP',
          description: 'My React Boilerplate-based project!',
          background_color: '#fafafa',
          theme_color: '#b1624d',
          inject: true,
          ios: true,
          icons: [
            {
              src: path.resolve('app/images/icon-512x512.png'),
              sizes: [72, 96, 128, 144, 192, 384, 512],
            },
            {
              src: path.resolve('app/images/icon-512x512.png'),
              sizes: [120, 152, 167, 180],
              ios: true,
            },
          ],
        }),
    
        new HashedModuleIdsPlugin({
          hashFunction: 'sha256',
          hashDigest: 'hex',
          hashDigestLength: 20,
        }),
      ],
    
      performance: {
        assetFilter: assetFilename =>
          !/(\.map$)|(^(main\.|favicon\.))/.test(assetFilename),
      },
    });

    There is just one more thing I have to say: I’m using Linux Mint 19, npm 6.4.1, nodejs 10.12.0.

    So, how can I configure webpack in order to get this workibg in production mode?


    Hristo
    Participant

    Hello assembler,

    Could you clarify it when the project works but does the browser load the example normally?
    Is there any error message in the console?

    The mentioned error “Module parse failed: Unexpected token” it happens because there is missing a “loader”.

    Best Regards,
    Hristo Hristov

    jQWidgets team
    https://www.jqwidgets.com

Viewing 2 posts - 1 through 2 (of 2 total)

You must be logged in to reply to this topic.