由于最近在vue-cli生成的webpack模板项目的基础上写一个小东西,开发过程中需要改动到build和config里面一些相关的配置,所以刚好趁此机会将所有配置文件看一遍,理一理思路,也便于以后修改配置的时候不会“太折腾”。

Vue-webpack项目配置详解

1、首先我们在构建vue项目后,就得先了解vue的项目结构

  1. ├── build --------------------------------- webpack相关配置文件
  2. ├── build.js --------------------------webpack打包配置文件
  3. ├── check-versions.js ------------------------------ 检查npm,nodejs版本
  4. ├── dev-client.js ---------------------------------- 设置环境
  5. ├── dev-server.js ---------------------------------- 创建express服务器,配置中间件,启动可热重载的服务器,用于开发项目
  6. ├── utils.js --------------------------------------- 配置资源路径,配置css加载器
  7. ├── vue-loader.conf.js ----------------------------- 配置css加载器等
  8. ├── webpack.base.conf.js --------------------------- webpack基本配置
  9. ├── webpack.dev.conf.js ---------------------------- 用于开发的webpack设置
  10. ├── webpack.prod.conf.js --------------------------- 用于打包的webpack设置
  11. ├── config ---------------------------------- 配置文件
  12. ├── node_modules ---------------------------- 存放依赖的目录
  13. ├── src ------------------------------------- 源码
  14. ├── assets ------------------------------ 静态文件
  15. ├── components -------------------------- 组件
  16. ├── main.js ----------------------------- js
  17. ├── App.vue ----------------------------- 项目入口组件
  18. ├── router ------------------------------ 路由
  19. ├── package.json ---------------------------- node配置文件
  20. ├── .babelrc--------------------------------- babel配置文件
  21. ├── .editorconfig---------------------------- 编辑器配置
  22. ├── .gitignore------------------------------- 配置git可忽略的文件

2、接下来我们来分析各个模块的用处

先从dev-server.js开始

  1. require('./check-versions')() //检查node和npm的版本
  2.  
  3. /*获取config/index.js中的默认配置,config后面没有配置项会自动找index.js*/
  4. var config = require('../config')
  5.  
  6. /*如果Node环境无法判断是dev还是product环境则使用config.dev.env.NODE_ENV作为当前执行环境*/
  7. if (!process.env.NODE_ENV) {
  8. process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
  9. }
  10.  
  11. var opn = require('opn') //一个可以强制打开浏览器并跳转到指定url的插件
  12.  
  13. var path = require('path') //使用Node自带的文件路径工具
  14.  
  15. var express = require('express') //使用express
  16.  
  17. var webpack = require('webpack') //使用webpack
  18.  
  19. var proxyMiddleware = require('http-proxy-middleware') //一个Node的代理中间件
  20.  
  21. var webpackConfig = process.env.NODE_ENV === 'testing'
  22. ? require('./webpack.prod.conf')
  23. : require('./webpack.dev.conf')//根据不同的Node环境加载不同的webpack配置
  24.  
  25. // default port where dev server listens for incoming traffic,如果没有指定端口就是用config.dev.port作为运行端口
  26. var port = process.env.PORT || config.dev.port
  27.  
  28. // automatically open browser, if not set will be false根据config.dev.autoOpenBrowser选择是否自动打开浏览器
  29. var autoOpenBrowser = !!config.dev.autoOpenBrowser
  30.  
  31. // Define HTTP proxies to your custom API backend
  32. // https://github.com/chimurai/http-proxy-middleware
  33. //使用 config.dev.proxyTable 的配置作为 proxyTable 的代理配置
  34.  
  35. var proxyTable = config.dev.proxyTable
  36.  
  37. var app = express()//使用express启动一个服务
  38.  
  39. var compiler = webpack(webpackConfig)//启动webpack进行编译
  40.  
  41. // 启动 webpack-dev-middleware,将 编译后的文件暂存到内存中
  42.  
  43. var devMiddleware = require('webpack-dev-middleware')(compiler, {
  44. publicPath: webpackConfig.output.publicPath,
  45. quiet: true
  46. })
  47.  
  48. // 启动 webpack-hot-middleware,也就是我们常说的 Hot-reload,https://www.npmjs.com/package/webpack-hot-middleware
  49.  
  50. var hotMiddleware = require('webpack-hot-middleware')(compiler, {
  51. log: () => {},
  52. heartbeat: 2000
  53. })
  54.  
  55. // 当html-webpack-plugin模板更改时,强制页面重新加载
  56.  
  57. compiler.plugin('compilation', function (compilation) {
  58. compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
  59. hotMiddleware.publish({ action: 'reload' })
  60. cb()
  61. })
  62. })
  63.  
  64. // proxy api requests
  65. //将 proxyTable 中的请求配置挂在到启动的 express 服务上
  66.  
  67. Object.keys(proxyTable).forEach(function (context) {
  68. var options = proxyTable[context]
  69. if (typeof options === 'string') {
  70. options = { target: options }
  71. }
  72. app.use(proxyMiddleware(options.filter || context, options))
  73. })
  74.  
  75. // handle fallback for HTML5 history API
  76. //使用 connect-history-api-fallback 匹配资源,如果不匹配就可以重定向到指定地址
  77. // https://www.npmjs.com/package/connect-history-api-fallback
  78.  
  79. app.use(require('connect-history-api-fallback')())
  80.  
  81. // serve webpack bundle output
  82. //将暂存到内存中的 webpack 编译后的文件挂在到 express 服务上
  83.  
  84. app.use(devMiddleware)
  85.  
  86. // enable hot-reload and state-preserving
  87. // compilation error display
  88. //将 Hot-reload 挂在到 express 服务上
  89.  
  90. app.use(hotMiddleware)
  91.  
  92. // serve pure static assets
  93. //拼接 static 文件夹的静态资源路径
  94.  
  95. var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
  96.  
  97. app.use(staticPath, express.static('./static'))
  98.  
  99. // 让我们这个 express 服务监听 port 的请求,并且将此服务作为 dev-server.js 的接口暴露出去
  100.  
  101. var uri = 'http://localhost:' + port
  102.  
  103. var _resolve
  104.  
  105. var readyPromise = new Promise(resolve => {
  106. _resolve = resolve
  107. })
  108.  
  109. console.log('> Starting dev server...')
  110.  
  111. devMiddleware.waitUntilValid(() => {
  112. console.log('> Listening at ' + uri + '\n')
  113.  
  114. // when env is testing, don't need open it
  115.  
  116. // 如果不是测试环境,自动打开浏览器并跳到我们的开发地址
  117.  
  118. if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
  119. opn(uri)
  120. }
  121. _resolve()
  122. })
  123.  
  124. var server = app.listen(port)
  125. module.exports = {
  126. ready: readyPromise,
  127. close: () => {
  128. server.close()
  129. }
  130. }

  

这个文件引用了三个配置文件,分别是config/index.js,webpack.prod.conf.js, 
webpack.dev.conf.js,那我们就直接按照先后顺序来吧.

index.js

  1. // see http://vuejs-templates.github.io/webpack for documentation.
  2.  
  3. var path = require('path')//使用Node自带的文件路径插件
  4. module.exports = {
  5.  
  6. //生产环境配置
  7. build: {
  8. //http://vuejs-templates.github.io/webpack/backend.html
  9. // 使用 config/prod.env.js 中定义的编译环境
  10.  
  11. env: require('./prod.env'),
  12.  
  13. index: path.resolve(__dirname, '../dist/index.html'), // 编译注入的 index.html 文件,必须是本地的绝对路径
  14.  
  15. assetsRoot: path.resolve(__dirname, '../dist'), // 编译输出的静态资源根路径
  16.  
  17. assetsSubDirectory: 'static', // 编译输出的二级目录
  18.  
  19. assetsPublicPath: '/', // 编译发布上线路径的根目录,可配置为资源服务器域名或 CDN 域名
  20.  
  21. productionSourceMap: true, //生成用于生产构建的源映射
  22.  
  23. // Gzip off by default as many popular static hosts such as
  24. // Surge or Netlify already gzip all static assets for you.
  25. // Before setting to `true`, make sure to:
  26. // npm install --save-dev compression-webpack-plugin
  27.  
  28. productionGzip: false, // 是否开启 gzip
  29.  
  30. productionGzipExtensions: ['js', 'css'], // 需要使用 gzip 压缩的文件扩展名
  31.  
  32. // Run the build command with an extra argument to
  33. // View the bundle analyzer report after build finishes:
  34. // `npm run build --report`
  35. // Set to `true` or `false` to always turn it on or off
  36. bundleAnalyzerReport: process.env.npm_config_report //一个实用工具,用于分析项目的依赖关系https://www.npmjs.com/package/webpack-bundle-analyzer
  37. },
  38. //开发环境
  39. dev: {
  40.  
  41. env: require('./dev.env'), // 使用 config/dev.env.js 中定义的编译环境
  42.  
  43. port: 8080, // 运行测试页面的端口
  44.  
  45. autoOpenBrowser: true, //是否自动打开浏览器
  46.  
  47. assetsSubDirectory: 'static', // 编译输出的二级目录
  48.  
  49. assetsPublicPath: '/', // 编译发布上线路径的根目录,可配置为资源服务器域名或 CDN 域名
  50.  
  51. proxyTable: {
  52. //https://github.com/chimurai/http-proxy-middleware,配置方式
  53. }, // 需要 proxyTable 代理的接口(可跨域)http://vuejs-templates.github.io/webpack/proxy.html
  54.  
  55. // CSS Sourcemaps off by default because relative paths are "buggy"
  56. // with this option, according to the CSS-Loader README
  57. // (https://github.com/webpack/css-loader#sourcemaps)
  58. // In our experience, they generally work as expected,
  59. // just be aware of this issue when enabling this option.
  60.  
  61. cssSourceMap: false // 是否开启 cssSourceMap
  62. }
  63. }

  

webpack.base.conf.js

这是基本配置,后面可以通过webpack-merge,将基本配置和不同环境的配置合并到一起,避免代码重复。

  1. var path = require('path') // 使用 NodeJS 自带的文件路径插件
  2.  
  3. var utils = require('./utils') //封装了一些方法的工具
  4.  
  5. var config = require('../config') //使用 config/index.js
  6.  
  7. var vueLoaderConfig = require('./vue-loader.conf') //使用
  8. vue-loader.conf
  9.  
  10. // 拼接我们的工作区路径为一个绝对路径
  11. function resolve (dir) {
  12. return path.join(__dirname, '..', dir)
  13. }
  14.  
  15. module.exports = {
  16.  
  17. entry: {
  18. // 编译文件入口
  19. app: './src/main.js'
  20. },
  21.  
  22. output: {
  23. //使用chonfig/index.js中build的assetsRoot作为输出根路径
  24. path: config.build.assetsRoot,
  25.  
  26. filename: '[name].js', //编译输入的文件名
  27.  
  28. publicPath: process.env.NODE_ENV === 'production' // 正式发布环境下编译输出的发布路径
  29. ? config.build.assetsPublicPath
  30. : config.dev.assetsPublicPath
  31. },
  32.  
  33. resolve: { //https://doc.webpack-china.org/configuration/resolve/
  34.  
  35. // 自动补全的扩展名,能够使用户在引入模块时不带扩展
  36. extensions: ['.js', '.vue', '.json'],
  37.  
  38. // 默认路径代理,例如 import Vue from 'vue$',会自动到 'vue/dist/vue.esm.js'中寻找
  39.  
  40. alias: {
  41. 'vue$': 'vue/dist/vue.esm.js',
  42. '@': resolve('src')
  43. }
  44. },
  45.  
  46. module: { //https://doc.webpack-china.org/loaders/ loader列表
  47.  
  48. rules: [ //https://doc.webpack-china.org/configuration/module/
  49.  
  50. //模块的规则数组,详情请参考上述链接的loader列表
  51. {
  52. test: /\.(js|vue)$/,//
  53. loader: 'eslint-loader',
  54. enforce: 'pre',
  55. include: [resolve('src'), resolve('test')],
  56. options: {
  57. formatter: require('eslint-friendly-formatter')
  58. }
  59. },
  60. {
  61. test: /\.vue$/,
  62. loader: 'vue-loader',
  63. options: vueLoaderConfig
  64. },
  65. {
  66. test: /\.js$/,
  67. loader: 'babel-loader',
  68. include: [resolve('src'), resolve('test')]
  69. },
  70. {
  71. test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
  72. loader: 'url-loader',
  73. options: {
  74. limit: 10000,
  75. name: utils.assetsPath('img/[name].[hash:7].[ext]')
  76. }
  77. },
  78. {
  79. test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
  80. loader: 'url-loader',
  81. options: {
  82. limit: 10000,
  83. name: utils.assetsPath('media/[name].[hash:7].[ext]')
  84. }
  85. },
  86. {
  87. test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
  88. loader: 'url-loader',
  89. options: {
  90. limit: 10000,
  91. name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
  92. }
  93. }
  94. ]
  95. }
  96. }

  

webpack.prod.conf.js

  1. var path = require('path') //...
  2.  
  3. var utils = require('./utils') //...
  4.  
  5. var webpack = require('webpack') //...
  6.  
  7. var config = require('../config') //...
  8.  
  9. var merge = require('webpack-merge') //...
  10.  
  11. var baseWebpackConfig =
  12. require('./webpack.base.conf') //...
  13.  
  14. //可以将单个文件或整个目录复制到构建目录中
  15.  
  16. var CopyWebpackPlugin = require('copy-webpack-plugin')
  17.  
  18. // 一个可以插入 html 并且创建新的 .html 文件的插件
  19.  
  20. var HtmlWebpackPlugin = require('html-webpack-plugin')
  21.  
  22. // 一个 webpack 扩展,可以提取一些代码并且将它们和文件分离开
  23. // 如果我们想将 webpack 打包成一个文件 css js 分离开,那我们需要这个插件
  24.  
  25. var ExtractTextPlugin = require('extract-text-webpack-plugin')
  26.  
  27. //一个个优化/最小化css资源的插件
  28.  
  29. var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
  30.  
  31. var env = process.env.NODE_ENV === 'testing'
  32. ? require('../config/test.env')
  33. : config.build.env//如果不是测试环境就直接使用生产环境
  34.  
  35. //合并 webpack.base.conf.js中的配置,里面具体的配置参考webpack.base.conf.js里面的注释
  36.  
  37. var webpackConfig = merge(baseWebpackConfig, {
  38.  
  39. module: {
  40. rules: utils.styleLoaders({
  41. sourceMap: config.build.productionSourceMap,
  42. extract: true
  43. })
  44. },
  45.  
  46. devtool: config.build.productionSourceMap ? '#source-map' : false,
  47.  
  48. output: {
  49. path: config.build.assetsRoot, //指定生产环境输出路径
  50. filename: utils.assetsPath('js/[name].[chunkhash].js'), //编译输出带hash的文件名,可以指定hash长度(chunkhash:6)
  51. chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') // 没有指定输出名的文件输出的文件名
  52. },
  53.  
  54. plugins: [
  55.  
  56. // http://vuejs.github.io/vue-loader/en/workflow/production.html
  57.  
  58. // definePlugin 接收字符串插入到代码当中, 所以你需要的话可以写上 JS 的字符串
  59.  
  60. new webpack.DefinePlugin({
  61. 'process.env': env
  62. }),
  63.  
  64. // 压缩 js (同样可以压缩 css)
  65.  
  66. new webpack.optimize.UglifyJsPlugin({
  67. compress: {
  68. warnings: false
  69. },
  70. sourceMap: true
  71. }),
  72.  
  73. // extract css into its own file
  74. //将 css 文件分离出来
  75.  
  76. new ExtractTextPlugin({
  77. filename: utils.assetsPath('css/[name].[contenthash].css')
  78. }),
  79.  
  80. // Compress extracted CSS. We are using this plugin so that possible
  81. // duplicated CSS from different components can be deduped.
  82. //压缩css代码
  83.  
  84. new OptimizeCSSPlugin({
  85. cssProcessorOptions: {
  86. safe: true
  87. }
  88. }),
  89.  
  90. // generate dist index.html with correct asset hash for caching.
  91. // you can customize output by editing /index.html
  92. // see https://github.com/ampedandwired/html-webpack-plugin
  93. // 输入输出的 .html 文件
  94.  
  95. new HtmlWebpackPlugin({
  96. filename: process.env.NODE_ENV === 'testing'
  97. ? 'index.html'
  98. : config.build.index,
  99. template: 'index.html',
  100. inject: true, // 是否注入 html
  101. minify: { // 压缩的方式
  102. removeComments: true, //移除带html的注释
  103. collapseWhitespace: true, //移除空格
  104. removeAttributeQuotes: true //移除属性的引号
  105.  
  106. // more options:
  107. // https://github.com/kangax/html-minifier#options-quick-reference
  108. },
  109.  
  110. // necessary to consistently work with multiple chunks via CommonsChunkPlugin
  111. //https://doc.webpack-china.org/plugins/commons-chunk-plugin/
  112.  
  113. chunksSortMode: 'dependency' //资源按照依赖关系去插入
  114. }),
  115.  
  116. // split vendor js into its own file//将引用的库文件拆出来打包到一个[name].js文件中
  117.  
  118. new webpack.optimize.CommonsChunkPlugin({
  119. name: 'vendor',
  120. minChunks: function (module, count) {
  121.  
  122. // any required modules inside node_modules are extracted to vendor
  123. //任何一个从node_modules中引用的模块都会被打包进来
  124.  
  125. return (
  126. module.resource &&
  127. /\.js$/.test(module.resource) &&
  128. module.resource.indexOf(
  129. path.join(__dirname, '../node_modules')
  130. ) === 0
  131. )
  132. }
  133. }),
  134.  
  135. // extract webpack runtime and module manifest to its own file in order to
  136. // prevent vendor hash from being updated whenever app bundle is updated
  137. //https://doc.webpack-china.org/concepts/manifest/
  138. //把webpack的runtime和manifest这些webpack管理所有模块交互的代码打包到[name].js文件中,防止build之后vendor的hash值被更新
  139.  
  140. new webpack.optimize.CommonsChunkPlugin({
  141. name: 'manifest',
  142. chunks: ['vendor']
  143. }),
  144.  
  145. // copy custom static assets
  146. //复制自定义的静态资源文件到dist/static文件夹中
  147.  
  148. new CopyWebpackPlugin([
  149. {
  150. from: path.resolve(__dirname, '../static'),
  151. to: config.build.assetsSubDirectory,
  152. ignore: ['.*']
  153. }
  154. ])
  155. ]
  156. })
  157.  
  158. // 开启 gzip 的情况下使用下方的配置
  159.  
  160. if (config.build.productionGzip) {
  161. // Gzip依赖 compression-webpack-plugin 插件
  162.  
  163. var CompressionWebpackPlugin = require('compression-webpack-plugin')
  164.  
  165. // 向webpackconfig.plugins中加入下方的插件
  166.  
  167. webpackConfig.plugins.push(
  168. // 使用 compression-webpack-plugin 插件进行压缩,https://doc.webpack-china.org/plugins/compression-webpack-plugin/
  169.  
  170. new CompressionWebpackPlugin({
  171. asset: '[path].gz[query]',//目标资源名称
  172. algorithm: 'gzip',//压缩方式
  173. test: new RegExp(
  174. '\\.(' +
  175. config.build.productionGzipExtensions.join('|') +
  176. ')$'
  177. ),//所有匹配该正则的资源都会被处理。默认值是全部资源。
  178. threshold: 10240,//只有大小大于该值的资源会被处理。单位是 bytes。默认值是 0。
  179. minRatio: 0.8//只有压缩率小于这个值的资源才会被处理。默认值是 0.8。
  180. })
  181. )
  182. }
  183.  
  184. //配置项目分析工具加载下方插件
  185. if (config.build.bundleAnalyzerReport) {
  186. var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
  187. webpackConfig.plugins.push(new BundleAnalyzerPlugin())
  188. }
  189. module.exports = webpackConfig

  

webpack.dev.conf.js

  1. var utils = require('./utils')//封装了一些方法的工具
  2.  
  3. var webpack = require('webpack')//使用 webpack
  4.  
  5. var config = require('../config')//使用 config/index.js
  6.  
  7. var merge = require('webpack-merge')//使用 webpack 配置合并插件
  8.  
  9. var baseWebpackConfig = require('./webpack.base.conf')// 加载 webpack.base.conf
  10.  
  11. var HtmlWebpackPlugin = require('html-webpack-plugin')// 使用 html-webpack-plugin 插件,这个插件可以帮我们自动生成 html 并且注入到 .html 文件中
  12.  
  13. //https://www.npmjs.com/package/friendly-errors-webpack-plugin,可以识别某些类别的Webpack错误并进行清理,聚合和优先排序
  14. var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
  15.  
  16. // add hot-reload related code to entry chunks
  17. //将 Hol-reload 相对路径添加到 webpack.base.conf 的 对应 entry 前
  18. Object.keys(baseWebpackConfig.entry).forEach(function (name) {
  19. baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
  20. })
  21.  
  22. // 将我们 webpack.dev.conf.js 的配置和 webpack.base.conf.js 的配置合并
  23. module.exports = merge(baseWebpackConfig, {
  24. module: {
  25. // 使用 styleLoaders
  26. rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
  27. },
  28.  
  29. // 使用 #cheap-module-eval-source-map 模式作为开发辅助调试工具
  30. // 具体配置请参考https://doc.webpack-china.org/configuration/devtool/
  31. devtool: '#cheap-module-eval-source-map',
  32. plugins: [
  33.  
  34. // definePlugin 接收字符串插入到代码当中, 需要的话可以写上 JS 的字符串
  35. new webpack.DefinePlugin({
  36. 'process.env': config.dev.env
  37. }),
  38.  
  39. // https://github.com/glenjamin/webpack-hot-middleware#installation--usage
  40. // HotModule 插件在页面进行变更的时候只会重回对应的页面模块,不会重绘整个 html 文件
  41. new webpack.HotModuleReplacementPlugin(),
  42. //https://doc.webpack-china.org/plugins/no-emit-on-errors-plugin/
  43. //在编译出现错误时,使用 NoEmitOnErrorsPlugin 来跳过输出阶段。这样可以确保输出资源不会包含错误。
  44. new webpack.NoEmitOnErrorsPlugin(),
  45.  
  46. // https://github.com/ampedandwired/html-webpack-plugin
  47. // 将 index.html 作为入口,注入 html 代码后生成 index.html文件
  48. //https://doc.webpack-china.org/plugins/html-webpack-plugin/ webpack插件列表(中文)
  49. new HtmlWebpackPlugin({
  50. filename: 'index.html',
  51. template: 'index.html',
  52. inject: true
  53. }),
  54. //看上面
  55. new FriendlyErrorsPlugin()
  56. ]
  57. })

  

build.js

  1. require('./check-versions')()// 检查 Node 和 npm 版本
  2. process.env.NODE_ENV = 'production'//指定生产环境
  3. var ora = require('ora')// 一个很好看的 loading 插件
  4. var rm = require('rimraf')//提供node版本的UNIX的rm -rf命令
  5. var path = require('path')//使用Node自带的文件路径插件
  6. var chalk = require('chalk')//控制台高亮显示的插件
  7. var webpack = require('webpack')//使用 webpack
  8. var config = require('../config')//使用 config/index.js
  9. var webpackConfig = require('./webpack.prod.conf')// 加载 webpack.prod.conf
  10. // 使用 ora 打印出 loading + log
  11. var spinner = ora('building for production...')
  12. spinner.start()
  13. //https://www.npmjs.com/package/rimraf
  14. rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
  15. if (err) throw err//如果回调函数出现错误就抛出异常
  16. // 开始 webpack 的编译
  17. webpack(webpackConfig, function (err, stats) {//编译回调函数
  18. spinner.stop()
  19. if (err) throw err//编译失败就抛出异常
  20. process.stdout.write(stats.toString({//标准输出流
  21. colors: true,
  22. modules: false,
  23. children: false,
  24. chunks: false,
  25. chunkModules: false
  26. }) + '\n\n')
  27. console.log(chalk.cyan(' Build complete.\n'))
  28. console.log(chalk.yellow(
  29. ' Tip: built files are meant to be served over an HTTP server.\n' +
  30. ' Opening index.html over file:// won\'t work.\n'
  31. ))
  32. })
  33. })

  

build.js依赖的webpack.prod.conf.js已经在上面介绍了,所以翻上去看看吧.

dev.env.js, prod.env.js, test.env.js

这三个js里面的代码比较简单,就是输出了三个不同的node环境, 分别对应开发环境, 生产环境, 测试环境.

check-versions.js

这里面的代码主要是通过调用shell去打印出node和npm的版本信息,同时会给出版本依赖的警告信息.

  1. var chalk = require('chalk')// 用于在控制台输出高亮字体的插件
  2. var semver = require('semver')// 语义化版本检查插件
  3. var packageConfig = require('../package.json')// 引入package.json
  4. var shell = require('shelljs')//引入shelljs
  5. // 开辟子进程执行指令cmd并返回结果
  6. function exec (cmd) {
  7. return require('child_process').execSync(cmd).toString().trim()
  8. }
  9. // node和npm版本需求
  10. var versionRequirements = [
  11. {
  12. name: 'node',
  13. currentVersion: semver.clean(process.version),
  14. versionRequirement: packageConfig.engines.node
  15. },
  16. ]
  17. if (shell.which('npm')) {
  18. versionRequirements.push({
  19. name: 'npm',
  20. currentVersion: exec('npm --version'),
  21. versionRequirement: packageConfig.engines.npm
  22. })
  23. }
  24. module.exports = function () {
  25. var warnings = []
  26. // 依次判断版本是否符合要求
  27. for (var i = 0; i < versionRequirements.length; i++) {
  28. var mod = versionRequirements[i]
  29. if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
  30. warnings.push(mod.name + ': ' +
  31. chalk.red(mod.currentVersion) + ' should be ' +
  32. chalk.green(mod.versionRequirement)
  33. )
  34. }
  35. }
  36. if (warnings.length) {
  37. console.log('')
  38. // 如果有警告则将其输出到控制台
  39. console.log(chalk.yellow('To use this template, you must update following to modules:'))
  40. console.log()
  41. for (var i = 0; i < warnings.length; i++) {
  42. var warning = warnings[i]
  43. console.log(' ' + warning)
  44. }
  45. console.log()
  46. process.exit(1)
  47. }
  48. }

  

dev-client.js

这里主要是开发服务器热重载脚本,用来实现开发阶段的页面自动刷新.

vue与webpack的更多相关文章

  1. 在基于vue的webpack脚手架开发中使用了代理转发,结果浏览器发出的请求中不带cookie导致登录时总是session失效怎么办?

    环境:            有2个业务接口需要转发到82的服务器上:     ../user/getCode.do     ../user/doLogin.do 现象:          使用上述的 ...

  2. Vue.js——webpack

    Vue.js——60分钟webpack项目模板快速入门 browserify是一个 CommonJS风格的模块管理和打包工具,上一篇我们简单地介绍了Vue.js官方基于browserify构筑的一套开 ...

  3. vue+node+webpack搭建环境

    一.环境搭建 1.1.去官网安装node.js( http://www.runoob.com/nodejs/nodejs-install-setup.html  ) 注意node的版本,只有支持和谐模 ...

  4. Vue.js + Webpack

    vue.js Vue.js是一个构建数据驱动的 web 界面的库.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件 以上是Vue.js官方定义,故名思议,以数据驱动视 ...

  5. vue.js+webpack在一个简单实例中的使用过程demo

    这里主要记录vue.js+webpack在一个简单实例中的使用过程 说明:本次搭建基于Win 7平台 Node.js 安装官网提供了支持多种平台的的LTS版本下载,我们根据需要来进行下载安装.对于Wi ...

  6. 【非专业前端】vue+element+webpack

    先点这里(- ̄▽ ̄)- 环境搭建 默认你已经安装了node.js 下面安装vue和webpack npm install -g @vue/cli npm install -g @vue/cli-ini ...

  7. VUE + vue-cli + webpack 创建新项目

    首先记录一下命令. 这是一个睿智新手的笔记. p.s.这是配置好环境以后的命令. ----------------------------------------------- $ npm insta ...

  8. vue和webpack打包 项目相对路径修改

    一般vue使用webpack打包是整个工程的根目录,但是很多情况下都是把vue打包后的文件在某子目录下. 修改: 1,打开index.js assetsPublicPath:'/' 改为: asset ...

  9. vue init webpack nameXXX 报错问题:

    vue新建demo项目报错如下: M:\lhhVueTest>vue init webpack L21_VueProject vue-cli · Failed to download repo ...

  10. 运行vue init webpack vueTest时报错

    前言:好久没动vue项目了,早上心血来潮.准备写一个项目,然后坚持在github更新,不为别的,只为养成一个习惯. 运行vue init webpack vueTest时,报了下面的错误: 当时我思考 ...

随机推荐

  1. mybatis之增删改

    前面三小节内容主要是针对查询操作进行讲解,现在对mybatis增删改进行演示. 由于每次建立工程比较复杂,可以参考第一节:mybatis入门来搭建一个简单的工程,然后来测试本节内容. 1.增 1.新增 ...

  2. go中的string操作

    strings 判断字符串s是否以prefix开头 strings.HasPrefix(s string,preffix string) bool: 判断字符串s是否以suffix结尾 stirngs ...

  3. fragment中的onCreateView和onViewCreated的区别和

    (1)  onViewCreated在onCreateView执行完后立即执行. (2)  onCreateView返回的就是fragment要显示的view.

  4. MyEclipse中android 项目如何解决第三方jar无法关联源码的问题( The JAR of this class file belongs to container 'Android Private Libraries' which does not allow modifications to source attachments on its entries.)

    若我们要为第三方jar(android-support-v4.jar)关联源码通常的做法是 右键项目 单击菜单Properties 单击菜单 Java Build Path 单击 Libraries ...

  5. JNI Hello World

    1.什么是JNI:               JNI(Java Native Interface):java本地开发接口               JNI是一个协议,这个协议用来沟通java代码和 ...

  6. 你不知道的USB

    USB的接口类型.定义和原理 目前USB接口类型已经更新到了USB3.1和USB Type-C类型,下面就对USB的类型进行介绍整理 一.UCB的通信协议类型 1.1 USB定义及类型 USB(Uni ...

  7. C++ 空类,默认产生哪些成员函数

    C++ 空类,默认产生哪些成员函数.     默认构造函数.默认拷贝构造函数.默认析构函数.默认赋值运算符 这四个是我们通常大都知道的.但是除了这四个,还有两个,那就是取址运算符和 取址运算符 con ...

  8. Qt:代码里存在中文时带来的问题

    一.报错: 常量中有换行符 方法1: 把文本文件转化为unicode或者utf-8, 同是还要带上QString::fromLocal8Bit() 还有其他方法,感觉不靠谱 二.显示异常:乱码 QSt ...

  9. SQL 在表中插入

    SQL INSERT INTO 语句(在表中插入) INSERT INTO 语句用于向表中插入新记录. SQL INSERT INTO 语句 INSERT INTO 语句用于向表中插入新记录. SQL ...

  10. 用php 生成 excel 表格

    //引用新建对象require "../phpexcel/Classes/PHPExcel.php"; $excel = new PHPExcel(); 建表格 //Excel表格 ...