Browse Source

打包到七牛

张保健 5 years ago
parent
commit
61eea22cf5
5 changed files with 449 additions and 16 deletions
  1. 82 0
      build/build-cdn.js
  2. 3 0
      build/cdn.json
  3. 151 0
      build/webpack.prod-cdn.conf.js
  4. 209 15
      package-lock.json
  5. 4 1
      package.json

+ 82 - 0
build/build-cdn.js View File

@@ -0,0 +1,82 @@
1
+'use strict'
2
+require('./check-versions')()
3
+
4
+process.env.NODE_ENV = 'production'
5
+
6
+const ora = require('ora')
7
+const rm = require('rimraf')
8
+const path = require('path')
9
+const chalk = require('chalk')
10
+const webpack = require('webpack')
11
+const config = require('../config')
12
+const webpackConfig = require('./webpack.prod-cdn.conf')
13
+const writeJson = require('write-json')
14
+const QiniuPlugin = require('qiniu-webpack-plugin')
15
+// const utils = require('./utils')
16
+
17
+const spinner = ora('building for production...')
18
+spinner.start()
19
+
20
+const cdn_ver = require('./cdn.json').version
21
+
22
+const addVer = (ver) => {
23
+  const ar = ver.split('.')
24
+  ar[2] = parseInt(ar[2]) + 1
25
+  return ar.join('.')
26
+}
27
+
28
+const verNow = addVer(cdn_ver)
29
+
30
+webpackConfig.plugins.push(new QiniuPlugin({
31
+  ACCESS_KEY: 'E5sYahBxp7RfMECLXhCUZJD3U_BTKYGsPDS4NLFd',
32
+  SECRET_KEY: 'mlO3FEmRX-S_9XPCf9WrkvzgnpZ8IlmHeiVrIDQF',
33
+  bucket: 'vue',
34
+  path: `pad/${verNow}/`
35
+}))
36
+
37
+webpackConfig.output.publicPath = `//pwxva08mn.bkt.clouddn.com/pad/${verNow}/`
38
+// webpackConfig.output.filename = utils.assetsPath('js/[name].js')
39
+// webpackConfig.output.chunkFilename = utils.assetsPath('js/[id].js')
40
+
41
+// console.log(webpackConfig.plugins)
42
+// console.log(typeof webpackConfig.plugins)
43
+// console.log(Object.keys(webpackConfig.plugins))
44
+// webpackConfig.plugins.filter((el)=>{
45
+//   console.log(el)
46
+// })
47
+// return
48
+
49
+rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
50
+  if (err) throw err
51
+  console.log('run build')
52
+  webpack(webpackConfig, (err, stats) => {
53
+    spinner.stop()
54
+    if (err) throw err
55
+    process.stdout.write(stats.toString({
56
+      colors: true,
57
+      modules: false,
58
+      children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
59
+      chunks: false,
60
+      chunkModules: false
61
+    }) + '\n\n')
62
+
63
+    if (stats.hasErrors()) {
64
+      console.log(chalk.red('  Build failed with errors.\n'))
65
+      process.exit(1)
66
+    }
67
+    console.log('verNow,', verNow)
68
+
69
+    writeJson.promise(path.join(__dirname, './cdn.json'), {
70
+      version: verNow
71
+    }).then(function() {
72
+      // do stuff
73
+      console.log('write cdn.json ok')
74
+    })
75
+
76
+    console.log(chalk.cyan('  Build complete.\n'))
77
+    console.log(chalk.yellow(
78
+      '  Tip: built files are meant to be served over an HTTP server.\n' +
79
+      '  Opening index.html over file:// won\'t work.\n'
80
+    ))
81
+  })
82
+})

+ 3 - 0
build/cdn.json View File

@@ -0,0 +1,3 @@
1
+{
2
+  "version": "1.0.2"
3
+}

+ 151 - 0
build/webpack.prod-cdn.conf.js View File

@@ -0,0 +1,151 @@
1
+'use strict'
2
+const path = require('path')
3
+const utils = require('./utils')
4
+const webpack = require('webpack')
5
+const config = require('../config')
6
+const merge = require('webpack-merge')
7
+const baseWebpackConfig = require('./webpack.base.conf')
8
+const CopyWebpackPlugin = require('copy-webpack-plugin')
9
+const HtmlWebpackPlugin = require('html-webpack-plugin')
10
+const ExtractTextPlugin = require('extract-text-webpack-plugin')
11
+const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
12
+const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
13
+
14
+const env = require('../config/prod.env')
15
+
16
+const webpackConfig = merge(baseWebpackConfig, {
17
+  module: {
18
+    rules: utils.styleLoaders({
19
+      sourceMap: config.build.productionSourceMap,
20
+      extract: true,
21
+      usePostCSS: true
22
+    })
23
+  },
24
+  devtool: config.build.productionSourceMap ? config.build.devtool : false,
25
+  output: {
26
+    path: config.build.assetsRoot,
27
+    filename: utils.assetsPath('js/[name].[chunkhash:6].js'), // .[chunkhash:6]
28
+    chunkFilename: utils.assetsPath('js/[id].[chunkhash:6].js') //.[chunkhash:6]
29
+  },
30
+  plugins: [
31
+    new webpack.DefinePlugin({
32
+      'process.env': env
33
+    }),
34
+    new UglifyJsPlugin({
35
+      uglifyOptions: {
36
+        compress: {
37
+          warnings: false
38
+        }
39
+      },
40
+      sourceMap: config.build.productionSourceMap,
41
+      parallel: true
42
+    }),
43
+    // extract css into its own file
44
+    new ExtractTextPlugin({
45
+      filename: utils.assetsPath('css/[name].[contenthash:6].css'), //
46
+      // Setting the following option to `false` will not extract CSS from codesplit chunks.
47
+      // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
48
+      // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,
49
+      // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
50
+      allChunks: true,
51
+    }),
52
+    // Compress extracted CSS. We are using this plugin so that possible
53
+    // duplicated CSS from different components can be deduped.
54
+    new OptimizeCSSPlugin({
55
+      cssProcessorOptions: config.build.productionSourceMap
56
+        ? { safe: true, map: { inline: false } }
57
+        : { safe: true }
58
+    }),
59
+    // generate dist index.html with correct asset hash for caching.
60
+    // you can customize output by editing /index.html
61
+    // see https://github.com/ampedandwired/html-webpack-plugin
62
+    new HtmlWebpackPlugin({
63
+      filename: config.build.index,
64
+      template: 'index.html',
65
+      inject: true,
66
+      minify: {
67
+        removeComments: true,
68
+        collapseWhitespace: true,
69
+        removeAttributeQuotes: true
70
+        // more options:
71
+        // https://github.com/kangax/html-minifier#options-quick-reference
72
+      },
73
+      // 公共文件必须在自己引用的js文件之前引用 by vinceHuang
74
+      // chunks:['mainfest','vender','app'],
75
+      // necessary to consistently work with multiple chunks via CommonsChunkPlugin
76
+      // chunksSortMode: 'dependency'
77
+    }),
78
+    // keep module.id stable when vendor modules does not change
79
+    // new webpack.HashedModuleIdsPlugin(),
80
+    // enable scope hoisting
81
+    // new webpack.optimize.ModuleConcatenationPlugin(),
82
+    // split vendor js into its own file
83
+    // new webpack.optimize.CommonsChunkPlugin({
84
+    //   name: 'vendor',
85
+    //   minChunks (module) {
86
+    //     // any required modules inside node_modules are extracted to vendor
87
+    //     return (
88
+    //       module.resource &&
89
+    //       /\.js$/.test(module.resource) &&
90
+    //       module.resource.indexOf(
91
+    //         path.join(__dirname, '../node_modules')
92
+    //       ) === 0
93
+    //     )
94
+    //   }
95
+    // }),
96
+    // extract webpack runtime and module manifest to its own file in order to
97
+    // prevent vendor hash from being updated whenever app bundle is updated
98
+    // new webpack.optimize.CommonsChunkPlugin({
99
+    //   name: 'manifest',
100
+    //   minChunks: Infinity
101
+    // }),
102
+    // This instance extracts shared chunks from code splitted chunks and bundles them
103
+    // in a separate chunk, similar to the vendor chunk
104
+    // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
105
+    // new webpack.optimize.CommonsChunkPlugin({
106
+    //   name: 'app',
107
+    //   async: 'vendor-async',
108
+    //   children: true,
109
+    //   minChunks: 3
110
+    // }),
111
+
112
+    // copy custom static assets
113
+    new CopyWebpackPlugin([
114
+      {
115
+        from: path.resolve(__dirname, '../static'),
116
+        to: config.build.assetsSubDirectory,
117
+        ignore: ['.*']
118
+      }
119
+    ])
120
+  ]
121
+})
122
+
123
+if (config.build.productionGzip) {
124
+  const CompressionWebpackPlugin = require('compression-webpack-plugin')
125
+
126
+  webpackConfig.plugins.push(
127
+    new CompressionWebpackPlugin({
128
+      asset: '[path].gz[query]',
129
+      algorithm: 'gzip',
130
+      test: new RegExp(
131
+        '\\.(' +
132
+        config.build.productionGzipExtensions.join('|') +
133
+        ')$'
134
+      ),
135
+      threshold: 10240,
136
+      minRatio: 0.8
137
+    })
138
+  )
139
+}
140
+
141
+if (config.build.bundleAnalyzerReport) {
142
+  const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
143
+  webpackConfig.plugins.push(new BundleAnalyzerPlugin())
144
+}
145
+
146
+webpackConfig.plugins = webpackConfig.plugins || [];
147
+
148
+webpackConfig.devtool = "source-map"
149
+
150
+
151
+module.exports = webpackConfig

+ 209 - 15
package-lock.json View File

@@ -910,8 +910,7 @@
910 910
       "version": "2.0.6",
911 911
       "resolved": "http://registry.npm.taobao.org/asap/download/asap-2.0.6.tgz",
912 912
       "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
913
-      "dev": true,
914
-      "optional": true
913
+      "dev": true
915 914
     },
916 915
     "asn1": {
917 916
       "version": "0.2.4",
@@ -2306,6 +2305,7 @@
2306 2305
       "resolved": "http://registry.npm.taobao.org/boom/download/boom-2.10.1.tgz",
2307 2306
       "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
2308 2307
       "dev": true,
2308
+      "optional": true,
2309 2309
       "requires": {
2310 2310
         "hoek": "2.x.x"
2311 2311
       }
@@ -2467,6 +2467,12 @@
2467 2467
         "isarray": "^1.0.0"
2468 2468
       }
2469 2469
     },
2470
+    "buffer-concat": {
2471
+      "version": "0.0.1",
2472
+      "resolved": "https://registry.npmjs.org/buffer-concat/-/buffer-concat-0.0.1.tgz",
2473
+      "integrity": "sha1-Q+Hjx389IvtVvqaJCpLQN3jEwQo=",
2474
+      "dev": true
2475
+    },
2470 2476
     "buffer-from": {
2471 2477
       "version": "1.1.1",
2472 2478
       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
@@ -3410,6 +3416,12 @@
3410 3416
       "resolved": "http://registry.npm.taobao.org/countup.js/download/countup.js-1.9.3.tgz",
3411 3417
       "integrity": "sha1-zj5QzXFgRB5HjwfaMYle3MDxyd0="
3412 3418
     },
3419
+    "crc32": {
3420
+      "version": "0.2.2",
3421
+      "resolved": "https://registry.npmjs.org/crc32/-/crc32-0.2.2.tgz",
3422
+      "integrity": "sha1-etIg1v/c0Rn5/BJ6d3LKzqOQpLo=",
3423
+      "dev": true
3424
+    },
3413 3425
     "create-ecdh": {
3414 3426
       "version": "4.0.3",
3415 3427
       "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
@@ -5597,6 +5609,25 @@
5597 5609
         "mime-types": "^2.1.12"
5598 5610
       }
5599 5611
     },
5612
+    "formstream": {
5613
+      "version": "0.0.7",
5614
+      "resolved": "https://registry.npmjs.org/formstream/-/formstream-0.0.7.tgz",
5615
+      "integrity": "sha1-mB0ANnQ1lsVIIO49+0S6yhg0l4g=",
5616
+      "dev": true,
5617
+      "requires": {
5618
+        "buffer-concat": "0.0.1",
5619
+        "mime": "1.2.9",
5620
+        "pause-stream": ">=0.0.10"
5621
+      },
5622
+      "dependencies": {
5623
+        "mime": {
5624
+          "version": "1.2.9",
5625
+          "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.9.tgz",
5626
+          "integrity": "sha1-AJzUCGe9Nd5SGzuWbwTi+NTRPQk=",
5627
+          "dev": true
5628
+        }
5629
+      }
5630
+    },
5600 5631
     "forwarded": {
5601 5632
       "version": "0.1.2",
5602 5633
       "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
@@ -5704,7 +5735,8 @@
5704 5735
         "ansi-regex": {
5705 5736
           "version": "2.1.1",
5706 5737
           "bundled": true,
5707
-          "dev": true
5738
+          "dev": true,
5739
+          "optional": true
5708 5740
         },
5709 5741
         "aproba": {
5710 5742
           "version": "1.2.0",
@@ -5725,12 +5757,14 @@
5725 5757
         "balanced-match": {
5726 5758
           "version": "1.0.0",
5727 5759
           "bundled": true,
5728
-          "dev": true
5760
+          "dev": true,
5761
+          "optional": true
5729 5762
         },
5730 5763
         "brace-expansion": {
5731 5764
           "version": "1.1.11",
5732 5765
           "bundled": true,
5733 5766
           "dev": true,
5767
+          "optional": true,
5734 5768
           "requires": {
5735 5769
             "balanced-match": "^1.0.0",
5736 5770
             "concat-map": "0.0.1"
@@ -5745,17 +5779,20 @@
5745 5779
         "code-point-at": {
5746 5780
           "version": "1.1.0",
5747 5781
           "bundled": true,
5748
-          "dev": true
5782
+          "dev": true,
5783
+          "optional": true
5749 5784
         },
5750 5785
         "concat-map": {
5751 5786
           "version": "0.0.1",
5752 5787
           "bundled": true,
5753
-          "dev": true
5788
+          "dev": true,
5789
+          "optional": true
5754 5790
         },
5755 5791
         "console-control-strings": {
5756 5792
           "version": "1.1.0",
5757 5793
           "bundled": true,
5758
-          "dev": true
5794
+          "dev": true,
5795
+          "optional": true
5759 5796
         },
5760 5797
         "core-util-is": {
5761 5798
           "version": "1.0.2",
@@ -5872,7 +5909,8 @@
5872 5909
         "inherits": {
5873 5910
           "version": "2.0.3",
5874 5911
           "bundled": true,
5875
-          "dev": true
5912
+          "dev": true,
5913
+          "optional": true
5876 5914
         },
5877 5915
         "ini": {
5878 5916
           "version": "1.3.5",
@@ -5884,6 +5922,7 @@
5884 5922
           "version": "1.0.0",
5885 5923
           "bundled": true,
5886 5924
           "dev": true,
5925
+          "optional": true,
5887 5926
           "requires": {
5888 5927
             "number-is-nan": "^1.0.0"
5889 5928
           }
@@ -5898,6 +5937,7 @@
5898 5937
           "version": "3.0.4",
5899 5938
           "bundled": true,
5900 5939
           "dev": true,
5940
+          "optional": true,
5901 5941
           "requires": {
5902 5942
             "brace-expansion": "^1.1.7"
5903 5943
           }
@@ -5905,12 +5945,14 @@
5905 5945
         "minimist": {
5906 5946
           "version": "0.0.8",
5907 5947
           "bundled": true,
5908
-          "dev": true
5948
+          "dev": true,
5949
+          "optional": true
5909 5950
         },
5910 5951
         "minipass": {
5911 5952
           "version": "2.2.4",
5912 5953
           "bundled": true,
5913 5954
           "dev": true,
5955
+          "optional": true,
5914 5956
           "requires": {
5915 5957
             "safe-buffer": "^5.1.1",
5916 5958
             "yallist": "^3.0.0"
@@ -5929,6 +5971,7 @@
5929 5971
           "version": "0.5.1",
5930 5972
           "bundled": true,
5931 5973
           "dev": true,
5974
+          "optional": true,
5932 5975
           "requires": {
5933 5976
             "minimist": "0.0.8"
5934 5977
           }
@@ -6009,7 +6052,8 @@
6009 6052
         "number-is-nan": {
6010 6053
           "version": "1.0.1",
6011 6054
           "bundled": true,
6012
-          "dev": true
6055
+          "dev": true,
6056
+          "optional": true
6013 6057
         },
6014 6058
         "object-assign": {
6015 6059
           "version": "4.1.1",
@@ -6021,6 +6065,7 @@
6021 6065
           "version": "1.4.0",
6022 6066
           "bundled": true,
6023 6067
           "dev": true,
6068
+          "optional": true,
6024 6069
           "requires": {
6025 6070
             "wrappy": "1"
6026 6071
           }
@@ -6106,7 +6151,8 @@
6106 6151
         "safe-buffer": {
6107 6152
           "version": "5.1.1",
6108 6153
           "bundled": true,
6109
-          "dev": true
6154
+          "dev": true,
6155
+          "optional": true
6110 6156
         },
6111 6157
         "safer-buffer": {
6112 6158
           "version": "2.1.2",
@@ -6142,6 +6188,7 @@
6142 6188
           "version": "1.0.2",
6143 6189
           "bundled": true,
6144 6190
           "dev": true,
6191
+          "optional": true,
6145 6192
           "requires": {
6146 6193
             "code-point-at": "^1.0.0",
6147 6194
             "is-fullwidth-code-point": "^1.0.0",
@@ -6161,6 +6208,7 @@
6161 6208
           "version": "3.0.1",
6162 6209
           "bundled": true,
6163 6210
           "dev": true,
6211
+          "optional": true,
6164 6212
           "requires": {
6165 6213
             "ansi-regex": "^2.0.0"
6166 6214
           }
@@ -6204,12 +6252,14 @@
6204 6252
         "wrappy": {
6205 6253
           "version": "1.0.2",
6206 6254
           "bundled": true,
6207
-          "dev": true
6255
+          "dev": true,
6256
+          "optional": true
6208 6257
         },
6209 6258
         "yallist": {
6210 6259
           "version": "3.0.2",
6211 6260
           "bundled": true,
6212
-          "dev": true
6261
+          "dev": true,
6262
+          "optional": true
6213 6263
         }
6214 6264
       }
6215 6265
     },
@@ -6667,7 +6717,8 @@
6667 6717
       "version": "2.16.3",
6668 6718
       "resolved": "http://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
6669 6719
       "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
6670
-      "dev": true
6720
+      "dev": true,
6721
+      "optional": true
6671 6722
     },
6672 6723
     "home-or-tmp": {
6673 6724
       "version": "2.0.0",
@@ -6814,6 +6865,25 @@
6814 6865
         }
6815 6866
       }
6816 6867
     },
6868
+    "http-basic": {
6869
+      "version": "2.5.1",
6870
+      "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-2.5.1.tgz",
6871
+      "integrity": "sha1-jORHvbW2xXf4pj4/p4BW7Eu02/s=",
6872
+      "dev": true,
6873
+      "requires": {
6874
+        "caseless": "~0.11.0",
6875
+        "concat-stream": "^1.4.6",
6876
+        "http-response-object": "^1.0.0"
6877
+      },
6878
+      "dependencies": {
6879
+        "caseless": {
6880
+          "version": "0.11.0",
6881
+          "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
6882
+          "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
6883
+          "dev": true
6884
+        }
6885
+      }
6886
+    },
6817 6887
     "http-deceiver": {
6818 6888
       "version": "1.2.7",
6819 6889
       "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
@@ -6889,6 +6959,12 @@
6889 6959
         }
6890 6960
       }
6891 6961
     },
6962
+    "http-response-object": {
6963
+      "version": "1.1.0",
6964
+      "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-1.1.0.tgz",
6965
+      "integrity": "sha1-p8TnWq6C87tJBOT0P2FWc7TVGMM=",
6966
+      "dev": true
6967
+    },
6892 6968
     "http-signature": {
6893 6969
       "version": "1.2.0",
6894 6970
       "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
@@ -10037,6 +10113,15 @@
10037 10113
         "pinkie-promise": "^2.0.0"
10038 10114
       }
10039 10115
     },
10116
+    "pause-stream": {
10117
+      "version": "0.0.11",
10118
+      "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
10119
+      "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
10120
+      "dev": true,
10121
+      "requires": {
10122
+        "through": "~2.3"
10123
+      }
10124
+    },
10040 10125
     "pbkdf2": {
10041 10126
       "version": "3.0.16",
10042 10127
       "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz",
@@ -12341,7 +12426,6 @@
12341 12426
       "resolved": "http://registry.npm.taobao.org/promise/download/promise-7.3.1.tgz",
12342 12427
       "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=",
12343 12428
       "dev": true,
12344
-      "optional": true,
12345 12429
       "requires": {
12346 12430
         "asap": "~2.0.3"
12347 12431
       }
@@ -12456,6 +12540,38 @@
12456 12540
       "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
12457 12541
       "dev": true
12458 12542
     },
12543
+    "qiniu": {
12544
+      "version": "6.1.13",
12545
+      "resolved": "https://registry.npmjs.org/qiniu/-/qiniu-6.1.13.tgz",
12546
+      "integrity": "sha1-V/XWCXTGTYhx2A8n331DIRrjTwM=",
12547
+      "dev": true,
12548
+      "requires": {
12549
+        "crc32": "0.2.2",
12550
+        "formstream": "0.0.7",
12551
+        "mime": "1.2.9",
12552
+        "sync-request": "3.0.1",
12553
+        "urllib": "0.5.1"
12554
+      },
12555
+      "dependencies": {
12556
+        "mime": {
12557
+          "version": "1.2.9",
12558
+          "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.9.tgz",
12559
+          "integrity": "sha1-AJzUCGe9Nd5SGzuWbwTi+NTRPQk=",
12560
+          "dev": true
12561
+        }
12562
+      }
12563
+    },
12564
+    "qiniu-webpack-plugin": {
12565
+      "version": "0.4.2",
12566
+      "resolved": "https://registry.npmjs.org/qiniu-webpack-plugin/-/qiniu-webpack-plugin-0.4.2.tgz",
12567
+      "integrity": "sha1-eeSzD3KErNsOWP8os+PYaYQb/ts=",
12568
+      "dev": true,
12569
+      "requires": {
12570
+        "promise": "^7.1.1",
12571
+        "qiniu": "^6.1.9",
12572
+        "slash": "^1.0.0"
12573
+      }
12574
+    },
12459 12575
     "qr.js": {
12460 12576
       "version": "0.0.0",
12461 12577
       "resolved": "http://registry.npm.taobao.org/qr.js/download/qr.js-0.0.0.tgz",
@@ -14504,6 +14620,17 @@
14504 14620
       "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=",
14505 14621
       "dev": true
14506 14622
     },
14623
+    "sync-request": {
14624
+      "version": "3.0.1",
14625
+      "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-3.0.1.tgz",
14626
+      "integrity": "sha1-yqEjWq+Im6UBB2oYNMQ2gwqC+3M=",
14627
+      "dev": true,
14628
+      "requires": {
14629
+        "concat-stream": "^1.4.7",
14630
+        "http-response-object": "^1.0.1",
14631
+        "then-request": "^2.0.1"
14632
+      }
14633
+    },
14507 14634
     "table": {
14508 14635
       "version": "4.0.2",
14509 14636
       "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
@@ -14581,6 +14708,28 @@
14581 14708
       "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
14582 14709
       "dev": true
14583 14710
     },
14711
+    "then-request": {
14712
+      "version": "2.2.0",
14713
+      "resolved": "https://registry.npmjs.org/then-request/-/then-request-2.2.0.tgz",
14714
+      "integrity": "sha1-ZnizL6DKIY/laZgbvYhxtZQGDYE=",
14715
+      "dev": true,
14716
+      "requires": {
14717
+        "caseless": "~0.11.0",
14718
+        "concat-stream": "^1.4.7",
14719
+        "http-basic": "^2.5.1",
14720
+        "http-response-object": "^1.1.0",
14721
+        "promise": "^7.1.1",
14722
+        "qs": "^6.1.0"
14723
+      },
14724
+      "dependencies": {
14725
+        "caseless": {
14726
+          "version": "0.11.0",
14727
+          "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
14728
+          "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
14729
+          "dev": true
14730
+        }
14731
+      }
14732
+    },
14584 14733
     "throat": {
14585 14734
       "version": "4.1.0",
14586 14735
       "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz",
@@ -15152,6 +15301,24 @@
15152 15301
         "requires-port": "^1.0.0"
15153 15302
       }
15154 15303
     },
15304
+    "urllib": {
15305
+      "version": "0.5.1",
15306
+      "resolved": "https://registry.npmjs.org/urllib/-/urllib-0.5.1.tgz",
15307
+      "integrity": "sha1-niVrK3A9/gpZY3yw27QwjtVxlxs=",
15308
+      "dev": true,
15309
+      "requires": {
15310
+        "buffer-concat": "0.0.1",
15311
+        "debug": "0.7.2"
15312
+      },
15313
+      "dependencies": {
15314
+        "debug": {
15315
+          "version": "0.7.2",
15316
+          "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.2.tgz",
15317
+          "integrity": "sha1-BWaSyGZwl38RXegpF5GLjouaEPA=",
15318
+          "dev": true
15319
+        }
15320
+      }
15321
+    },
15155 15322
     "use": {
15156 15323
       "version": "3.1.1",
15157 15324
       "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
@@ -16458,6 +16625,33 @@
16458 16625
         "signal-exit": "^3.0.2"
16459 16626
       }
16460 16627
     },
16628
+    "write-json": {
16629
+      "version": "3.0.1",
16630
+      "resolved": "https://registry.npmjs.org/write-json/-/write-json-3.0.1.tgz",
16631
+      "integrity": "sha512-PWscN8FOlnT0oSuN3vuq9FW2Wjwh3fqSRFgd75NHiHApIdi55bnbLI5nyFQwaiqEn73+w8B9NVC36SWHCKwHhw==",
16632
+      "dev": true,
16633
+      "requires": {
16634
+        "isobject": "^3.0.1",
16635
+        "write": "^1.0.3"
16636
+      },
16637
+      "dependencies": {
16638
+        "isobject": {
16639
+          "version": "3.0.1",
16640
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
16641
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
16642
+          "dev": true
16643
+        },
16644
+        "write": {
16645
+          "version": "1.0.3",
16646
+          "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
16647
+          "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
16648
+          "dev": true,
16649
+          "requires": {
16650
+            "mkdirp": "^0.5.1"
16651
+          }
16652
+        }
16653
+      }
16654
+    },
16461 16655
     "ws": {
16462 16656
       "version": "5.2.2",
16463 16657
       "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz",

+ 4 - 1
package.json View File

@@ -12,6 +12,7 @@
12 12
     "test": "npm run unit && npm run e2e",
13 13
     "lint": "eslint --ext .js,.vue src test/unit test/e2e/specs",
14 14
     "build": "cross-env NODE_ENV=production env_config=prod node build/build.js && npm run fixfont && npm run fiximg",
15
+    "build-cdn": "node build/build-cdn.js",
15 16
     "fixfont": "xcopy %cd%\\dist\\static\\fonts %cd%\\dist\\static\\css\\static\\fonts /s /y /d /e /i",
16 17
     "fiximg": "xcopy %cd%\\dist\\static\\img %cd%\\dist\\static\\css\\static\\img /s /y /d /e /i"
17 18
   },
@@ -99,7 +100,9 @@
99 100
     "webpack-bundle-analyzer": "^2.9.0",
100 101
     "webpack-dev-server": "^2.9.1",
101 102
     "webpack-merge": "^4.1.0",
102
-    "yaml-loader": "^0.5.0"
103
+    "yaml-loader": "^0.5.0",
104
+    "write-json": "^3.0.1",
105
+    "qiniu-webpack-plugin": "^0.4.2"
103 106
   },
104 107
   "engines": {
105 108
     "node": ">= 6.0.0",