Left file: appwork-v1_5_2/laravel-vue-starter/webpack.mix.js  
Right file: appwork-v1_6_0/laravel-vue-starter/webpack.mix.js  
1 const { EnvironmentPlugin } = require('webpack') = 1 const { EnvironmentPlugin } = require('webpack')
2 const mix = require('laravel-mix')   2 const mix = require('laravel-mix')
3 const glob = require('glob')   3 const glob = require('glob')
4 const path = require('path')   4 const path = require('path')
5     5  
6 /*   6 /*
7  |--------------------------------------------------------------------------   7  |--------------------------------------------------------------------------
8  | Mix config   8  | Mix config
9  |--------------------------------------------------------------------------   9  |--------------------------------------------------------------------------
10  */   10  */
11     11  
12 mix.options({   12 mix.options({
    <> 13     resourceRoot: !Mix.config.hmr ? process.env.ASSET_URL : undefined,
13     postCss: [require('autoprefixer')]   14     postCss: [require('autoprefixer')],
      15     hmrOptions: {
      16         host: 'localhost',
      17         port: 8081
      18     }
14 });   19 })
15   = 20  
16 /*   21 /*
17  |--------------------------------------------------------------------------   22  |--------------------------------------------------------------------------
18  | Webpack config   23  | Webpack config
19  |--------------------------------------------------------------------------   24  |--------------------------------------------------------------------------
20  */   25  */
21     26  
22 mix.webpackConfig({   27 mix.webpackConfig({
    -+ 28     output: {
      29         publicPath: !Mix.config.hmr ? process.env.ASSET_URL : undefined,
      30     },
23     plugins: [ = 31     plugins: [
24         new EnvironmentPlugin({   32         new EnvironmentPlugin({
25             // Application's public url   33             // Application's public url
26             BASE_URL: '/' <> 34             BASE_URL: !Mix.config.hmr && process.env.ASSET_URL ? `${process.env.ASSET_URL}/` : '/'
27         }) = 35         })
28     ],   36     ],
29     module: {   37     module: {
30         rules: [{   38         rules: [{
31             test: /node_modules(?:\/|\\).+\.m?js$/,   39             test: /node_modules(?:\/|\\).+\.m?js$/,
32             loader: 'babel-loader',   40             loader: 'babel-loader',
33             include: [   41             include: [
34                 path.join(__dirname, 'node_modules/bootstrap-vue'),   42                 path.join(__dirname, 'node_modules/bootstrap-vue'),
35                 path.join(__dirname, 'node_modules/vuejs-datepicker'),   43                 path.join(__dirname, 'node_modules/vuejs-datepicker'),
36                 path.join(__dirname, 'node_modules/vue-echarts'),   44                 path.join(__dirname, 'node_modules/vue-echarts'),
37                 path.join(__dirname, 'node_modules/resize-detector'),   45                 path.join(__dirname, 'node_modules/resize-detector'),
38                 path.join(__dirname, 'node_modules/vue-c3'),   46                 path.join(__dirname, 'node_modules/vue-c3'),
39                 path.join(__dirname, 'node_modules/vue-masonry'),   47                 path.join(__dirname, 'node_modules/vue-masonry'),
40                 path.join(__dirname, 'node_modules/vue-cropper'),   48                 path.join(__dirname, 'node_modules/vue-cropper'),
41                 path.join(__dirname, 'node_modules/vuedraggable'),   49                 path.join(__dirname, 'node_modules/vuedraggable'),
42                 path.join(__dirname, 'node_modules/sweet-modal-vue'),   50                 path.join(__dirname, 'node_modules/sweet-modal-vue'),
43                 path.join(__dirname, 'node_modules/vue-simplemde'),   51                 path.join(__dirname, 'node_modules/vue-simplemde'),
44                 path.join(__dirname, 'node_modules/vue2-dropzone'),   52                 path.join(__dirname, 'node_modules/vue2-dropzone'),
45                 path.join(__dirname, 'node_modules/dropzone'),   53                 path.join(__dirname, 'node_modules/dropzone'),
46                 path.join(__dirname, 'node_modules/marked'),   54                 path.join(__dirname, 'node_modules/marked'),
47                 path.join(__dirname, 'node_modules/vue-plyr'),   55                 path.join(__dirname, 'node_modules/vue-plyr'),
48                 path.join(__dirname, 'node_modules/swiper'),   56                 path.join(__dirname, 'node_modules/swiper'),
49                 path.join(__dirname, 'node_modules/dom7')   57                 path.join(__dirname, 'node_modules/dom7')
50             ],   58             ],
51             options: Object.assign({}, require('./package.json').babel, {   59             options: Object.assign({}, require('./package.json').babel, {
52                 babelrc: false   60                 babelrc: false
53             })   61             })
54         }]   62         }]
55     },   63     },
56     resolve: {   64     resolve: {
57         alias: {   65         alias: {
58             '@': path.join(__dirname, 'resources/assets/src'),   66             '@': path.join(__dirname, 'resources/assets/src'),
59             'node_modules': path.join(__dirname, 'node_modules')   67             'node_modules': path.join(__dirname, 'node_modules')
60         }   68         }
    -+ 69     },
      70     devServer: {
      71         host: '0.0.0.0',
      72         port: 8081
61     } = 73     }
62 })   74 })
63     75  
    -+ 76 mix.override(config => {
      77     // Inject node-sass compiler
      78     config.module.rules
      79         .filter(rule => rule.test && (
      80             (typeof rule.test == 'string' && (rule.test.endsWith('.sass') || rule.test.endsWith('.scss'))) ||
      81             (typeof rule.test.test === 'function' && (rule.test.test('.sass') || rule.test.test('.scss')))
      82         ))
      83         .forEach(rule => {
      84             let loaders = []
      85  
      86             if (Array.isArray(rule.loaders)) {
      87                 loaders = rule.loaders.find(loader => loader.loader === 'sass-loader')
      88             }
      89             else if (Array.isArray(rule.oneOf)) {
      90                 rule.oneOf.forEach(item => {
      91                     loaders = loaders.concat(item.use.find(loader => loader.loader === 'sass-loader'))
      92                 })
      93             }
      94  
      95             loaders.forEach(loader => {
      96                 Object.assign(loader.options, {
      97                     implementation: require('node-sass')
      98                 })
      99             })
      100         })
      101  
      102     return config
      103 })
      104  
64 /* = 105 /*
65  |--------------------------------------------------------------------------   106  |--------------------------------------------------------------------------
66  | Vendor assets   107  | Vendor assets
67  |--------------------------------------------------------------------------   108  |--------------------------------------------------------------------------
68  */   109  */
69     110  
70 function mixAssetsDir(query, cb) {   111 function mixAssetsDir(query, cb) {
71     (glob.sync('resources/assets/' + query) || []).forEach(f => {   112     (glob.sync('resources/assets/' + query) || []).forEach(f => {
72         f = f.replace(/[\\\/]+/g, '/'); <> 113         f = f.replace(/[\\\/]+/g, '/')
73         cb(f, f.replace('resources/assets', 'public'));   114         cb(f, f.replace('resources/assets', 'public'))
74     });   115     })
75 } = 116 }
76     117  
77 const sassOptions = {   118 const sassOptions = {
78     implementation: () => require('node-sass') <> 119     implementation: require('node-sass')
79 };   120 }
80   = 121  
81 // Core javascripts   122 // Core javascripts
82 mixAssetsDir('vendor/js/**/*.js', (src, dest) => mix.scripts(src, dest)); <> 123 mixAssetsDir('vendor/js/**/*.js', (src, dest) => mix.scripts(src, dest))
83   = 124  
84 // Fonts   125 // Fonts
85 mixAssetsDir('vendor/fonts/*.css', (src, dest) => mix.copy(src, dest)); <> 126 mixAssetsDir('vendor/fonts/*.css', (src, dest) => mix.copy(src, dest))
86 mixAssetsDir('vendor/fonts/*/*', (src, dest) => mix.copy(src, dest));   127 mixAssetsDir('vendor/fonts/*/*', (src, dest) => mix.copy(src, dest))
87   = 128  
88 /*   129 /*
89  |--------------------------------------------------------------------------   130  |--------------------------------------------------------------------------
90  | Entry point   131  | Entry point
91  |--------------------------------------------------------------------------   132  |--------------------------------------------------------------------------
92  */   133  */
93     134  
94 mix.js('resources/assets/src/entry-point.js', 'public'); <> 135 mix.js('resources/assets/src/entry-point.js', 'public').vue({ version: 2 })
95   = 136  
96 if (Mix.isUsing('hmr')) {   137 if (Mix.isUsing('hmr')) {
97     mix.disableNotifications(); <> 138     mix.disableNotifications()
98 } else { = 139 } else {
99     mix.version(); <> 140     mix.version()
100 } = 141 }