Skip to content

Vue loader compiles code with reserved variables #1457

@jinnyMcKindy

Description

@jinnyMcKindy

Version

2.5.11

Reproduction link

https://github.com/volokolamskspb/KKR

Steps to reproduce

run `npm run build` Open Internet Expolrer

What is expected?

The app shouldn't throw errors

What is actually happening?

App is throwing an error and js stops working.

Detailled description

Vue loader compiles build.js with reserved property names.

method.default

This code doesn't work in IE11.

error
error2

package.json

{
  "name": "vue-ssr",
  "description": "A Vue.js project",
  "version": "1.0.0",
  "author": "",
  "license": "MIT",
  "private": true,
  "scripts": {
    "start": "npm run build && npm run start-server",
    "build": "npm run build-client && npm run build-server",
    "build-client": "cross-env NODE_ENV=production webpack --progress --hide-modules",
    "build-server": "cross-env NODE_ENV=production webpack --config webpack.server.config.js --progress --hide-modules",
    "start-server": "node server.js"
  },
  "dependencies": {
    "babel-plugin-array-includes": "^2.0.3",
    "es6-promise": "^4.2.5",
    "express": "^4.16.4",
    "express-favicon": "^2.0.1",
    "promise-polyfill": "8.1.0",
    "remove-strict-webpack-plugin": "^0.1.2",
    "vue": "^2.5.11",
    "vue-router": "^3.0.2",
    "vue-server-renderer": "^2.5.21",
    "vue-tabs-component": "^1.5.0",
    "vuejs-datepicker": "^1.5.4",
    "webpack-merge": "^4.1.5"
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "ie > 8"
  ],
  "devDependencies": {
    "@babel/preset-env": "^7.2.3",
    "axios": "^0.18.0",
    "babel-loader": "^7.1.2",
    "babel-core": "^6.26.0",
    "babel-plugin-es6-promise": "^1.1.1",
    "babel-plugin-transform-object-assign": "^6.22.0",
    "babel-preset-env": "^1.6.0",
    "babel-preset-stage-3": "^6.24.1",
    "cross-env": "^5.0.5",
    "css-loader": "^0.28.7",
    "vue-loader": "^13.0.5",
    "vue-template-compiler": "^2.4.4",
    "vuex": "^3.0.1",
    "webpack": "^3.6.0",
    "webpack-dev-server": "^3.1.10"
  }
}

Is there any way to rename or auto rewrite reserved words like this method['default']

My webpack.config

var path = require('path')
var webpack = require('webpack')
const RemoveStrictPlugin = require( 'remove-strict-webpack-plugin' );
module.exports = {
  entry: './src/entry-client.js',
  output: {
    path: path.resolve(__dirname, './dist'),
    publicPath: '/dist/',
    filename: 'build.js'
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          'vue-style-loader',
          'css-loader'
        ],
      },
      {
        test: /\.scss$/,
        use: [
          'vue-style-loader',
          'css-loader',
          'sass-loader'
        ],
      },
      {
        test: /\.sass$/,
        use: [
          'vue-style-loader',
          'css-loader',
          'sass-loader?indentedSyntax'
        ],
      },
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: {
          loaders: {
            // Since sass-loader (weirdly) has SCSS as its default parse mode, we map
            // the "scss" and "sass" values for the lang attribute to the right configs here.
            // other preprocessors should work out of the box, no loader config like this necessary.
            'scss': [
              'vue-style-loader',
              'css-loader',
              'sass-loader'
            ],
            'sass': [
              'vue-style-loader',
              'css-loader',
              'sass-loader?indentedSyntax'
            ]
          }
          // other vue-loader options go here
        }
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/
      },
      {
        test: /\.(png|jpg|gif|svg)$/,
        loader: 'file-loader',
        options: {
          name: '[name].[ext]?[hash]'
        }
      }
    ]
  },
  resolve: {
    alias: {
      'vue$': 'vue/dist/vue.esm.js'
    },
    extensions: ['*', '.js', '.vue', '.json']
  },
  devServer: {
    historyApiFallback: true,
    noInfo: true,
    overlay: true
  },
  performance: {
    hints: false
  },
  devtool: '#eval-source-map'
}

if (process.env.NODE_ENV === 'production') {
  module.exports.devtool = '#source-map'
  // http://vue-loader.vuejs.org/en/workflow/production.html
  module.exports.plugins = (module.exports.plugins || []).concat([
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: '"production"'
      }
    }),
    new webpack.optimize.UglifyJsPlugin({
      sourceMap: true,
      compress: {
        warnings: false
      },
      "uglifyOptions": {
        "ie8": true,
        "mangle": {
          "reserved": ['default']
        }
      }
    }),
    new webpack.LoaderOptionsPlugin({
      minimize: true
    }),
    new RemoveStrictPlugin()
  ])
}

webpack.server.config

var path = require('path')
var webpack = require('webpack')
var merge = require('webpack-merge')
var baseWebpackConfig = require('./webpack.config')

var webpackConfig = merge(baseWebpackConfig, {
  target: 'node',
  entry: {
    app: './src/entry-server.js'
  },
  devtool: "none",
  output: {
    path: path.resolve(__dirname, './dist'),
    filename: 'server.bundle.js',
    libraryTarget: 'commonjs2'
  },
  externals: Object.keys(require('./package.json').dependencies),
  plugins: [
    new webpack.DefinePlugin({
      'process.env': 'production'
    })
  ]
})
module.exports = webpackConfig

.babelrc

{
  "presets": [
    ["env", { "modules": false }],
    "stage-3"
  ],
  "plugins": [
    "transform-object-assign",
    "es6-promise",
    "array-includes"
  ]
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions