入口

package.json可以看到开发和生产环境的入口。

  1. "scripts": {
  2. "dev": "node build/dev-server.js",
  3. "build": "node build/build.js"
  4. }

开发环境

开发环境的入口文件是 build/dev-server.js

dev-server.js

该文件中,使用express作为后端框架,结合一些关于webpack的中间件,搭建了一个开发环境。

  1. // 配置文件
  2. var config = require('../config')
  3. // 如果 Node 的环境无法判断当前是 dev / product 环境
  4. // 使用 config.dev.env.NODE_ENV 作为当前的环境
  5. if (!process.env.NODE_ENV) {
  6. process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
  7. }
  8. // 可以强制打开浏览器并跳转到指定 url 的插件
  9. // https://github.com/sindresorhus/opn
  10. var opn = require('opn')
  11. // node自带的文件路径工具
  12. var path = require('path')
  13. // express框架
  14. var express = require('express')
  15. var webpack = require('webpack')
  16. // 测试环境,使用的配置与生产环境的配置一样
  17. // 非测试环境,即为开发环境,因为此文件只有测试环境和开发环境使用
  18. var proxyMiddleware = require('http-proxy-middleware')
  19. var webpackConfig = process.env.NODE_ENV === 'testing'
  20. // 生产环境配置文件
  21. ? require('./webpack.prod.conf')
  22. // 开发环境配置文件
  23. : require('./webpack.dev.conf')
  24. // 端口号为命令行输入的PORT参数或者配置文件中的默认值
  25. var port = process.env.PORT || config.dev.port
  26. // 配置文件中 是否自动打开浏览器
  27. var autoOpenBrowser = !!config.dev.autoOpenBrowser
  28. // 配置文件中 http代理配置
  29. // https://github.com/chimurai/http-proxy-middleware
  30. var proxyTable = config.dev.proxyTable
  31. // 启动 express 服务
  32. var app = express()
  33. // 启动 webpack 编译
  34. var compiler = webpack(webpackConfig)
  35. // 可以将编译后的文件暂存到内存中的插件
  36. // https://github.com/webpack/webpack-dev-middleware
  37. var devMiddleware = require('webpack-dev-middleware')(compiler, {
  38. // 公共路径,与webpack的publicPath一样
  39. publicPath: webpackConfig.output.publicPath,
  40. // 不打印
  41. quiet: true
  42. })
  43. // Hot-reload 热重载插件
  44. // https://github.com/glenjamin/webpack-hot-middleware
  45. var hotMiddleware = require('webpack-hot-middleware')(compiler, {
  46. log: () => {}
  47. })
  48. // 当tml-webpack-plugin template更改之后,强制刷新浏览器
  49. compiler.plugin('compilation', function (compilation) {
  50. compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
  51. hotMiddleware.publish({ action: 'reload' })
  52. cb()
  53. })
  54. })
  55. // 将 proxyTable 中的请求配置挂在到启动的 express 服务上
  56. Object.keys(proxyTable).forEach(function (context) {
  57. var options = proxyTable[context]
  58. // 如果options的数据类型为string,则表示只设置了url,
  59. // 所以需要将url设置为对象中的 target的值
  60. if (typeof options === 'string') {
  61. options = { target: options }
  62. }
  63. app.use(proxyMiddleware(options.filter || context, options))
  64. })
  65. // 使用 connect-history-api-fallback 匹配资源
  66. // 如果不匹配就可以重定向到指定地址
  67. // https://github.com/bripkens/connect-history-api-fallback
  68. app.use(require('connect-history-api-fallback')())
  69. // 将暂存到内存中的 webpack 编译后的文件挂在到 express 服务上
  70. app.use(devMiddleware)
  71. // 将 Hot-reload 挂在到 express 服务上
  72. app.use(hotMiddleware)
  73. // 拼接 static 文件夹的静态资源路径
  74. var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
  75. // 静态文件服务
  76. app.use(staticPath, express.static('./static'))
  77. var uri = 'http://localhost:' + port
  78. // 编译成功后打印网址信息
  79. devMiddleware.waitUntilValid(function () {
  80. console.log('> Listening at ' + uri + '\n')
  81. })
  82. module.exports = app.listen(port, function (err) {
  83. if (err) {
  84. console.log(err)
  85. return
  86. }
  87. // 如果配置了自动打开浏览器,且不是测试环境,则自动打开浏览器并跳到我们的开发地址
  88. if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
  89. opn(uri)
  90. }
  91. })

webpack.dev.conf.js

dev-server.js中使用了webpack.dev.conf.js文件,该文件是开发环境中webpack的配置入口。

  1. // 工具函数集合
  2. var utils = require('./utils')
  3. var webpack = require('webpack')
  4. // 配置文件
  5. var config = require('../config')
  6. // webpack 配置合并插件
  7. var merge = require('webpack-merge')
  8. // webpac基本配置
  9. var baseWebpackConfig = require('./webpack.base.conf')
  10. // 自动生成 html 并且注入到 .html 文件中的插件
  11. // https://github.com/ampedandwired/html-webpack-plugin
  12. var HtmlWebpackPlugin = require('html-webpack-plugin')
  13. // webpack错误信息提示插件
  14. // https://github.com/geowarin/friendly-errors-webpack-plugin
  15. var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
  16. // 将 Hol-reload 热重载的客户端代码添加到 webpack.base.conf 的 对应 entry 中,一起打包
  17. Object.keys(baseWebpackConfig.entry).forEach(function(name) {
  18. baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
  19. })
  20. module.exports = merge(baseWebpackConfig, {
  21. module: {
  22. // styleLoaders
  23. rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
  24. },
  25. // 最新的配置为 cheap-module-eval-source-map,虽然 cheap-module-eval-source-map更快,但它的定位不准确
  26. // 所以,换成 eval-source-map
  27. devtool: '#eval-source-map',
  28. plugins: [
  29. // definePlugin 接收字符串插入到代码当中, 所以你需要的话可以写上 JS 的字符串
  30. // 此处,插入适当的环境
  31. // https://webpack.js.org/plugins/define-plugin/
  32. new webpack.DefinePlugin({
  33. 'process.env': config.dev.env
  34. }),
  35. // HotModule 插件在页面进行变更的时候只会重绘对应的页面模块,不会重绘整个 html 文件
  36. // https://github.com/glenjamin/webpack-hot-middleware#installation--usage
  37. new webpack.HotModuleReplacementPlugin(),
  38. new webpack.NoEmitOnErrorsPlugin(),
  39. // 将 index.html 作为入口,注入 html 代码后生成 index.html文件
  40. // https://github.com/ampedandwired/html-webpack-plugin
  41. new HtmlWebpackPlugin({
  42. filename: 'index.html',
  43. template: 'index.html',
  44. inject: true
  45. }),
  46. // webpack错误信息提示插件
  47. new FriendlyErrorsPlugin()
  48. ]
  49. })

webpack.base.conf.js

webpack.dev.conf.js中出现webpack.base.conf.js,这个文件是开发环境和生产环境,甚至测试环境,这些环境的公共webpack配置。可以说,这个文件相当重要。

  1. // node自带的文件路径工具
  2. var path = require('path')
  3. // 工具函数集合
  4. var utils = require('./utils')
  5. // 配置文件
  6. var config = require('../config')
  7. // 工具函数集合
  8. var vueLoaderConfig = require('./vue-loader.conf')
  9. /**
  10. * 获得绝对路径
  11. * @method resolve
  12. * @param {String} dir 相对于本文件的路径
  13. * @return {String} 绝对路径
  14. */
  15. function resolve(dir) {
  16. return path.join(__dirname, '..', dir)
  17. }
  18. module.exports = {
  19. entry: {
  20. app: './src/main.js'
  21. },
  22. output: {
  23. // 编译输出的静态资源根路径
  24. path: config.build.assetsRoot,
  25. // 编译输出的文件名
  26. filename: '[name].js',
  27. // 正式发布环境下编译输出的上线路径的根路径
  28. publicPath: process.env.NODE_ENV === 'production' ?
  29. config.build.assetsPublicPath : config.dev.assetsPublicPath
  30. },
  31. resolve: {
  32. // 自动补全的扩展名
  33. extensions: ['.js', '.vue', '.json'],
  34. // 路径别名
  35. alias: {
  36. // 例如 import Vue from 'vue',会自动到 'vue/dist/vue.common.js'中寻找
  37. 'vue$': 'vue/dist/vue.esm.js',
  38. '@': resolve('src'),
  39. }
  40. },
  41. module: {
  42. rules: [{
  43. // 审查 js 和 vue 文件
  44. // https://github.com/MoOx/eslint-loader
  45. test: /\.(js|vue)$/,
  46. loader: 'eslint-loader',
  47. // 表示预先处理
  48. enforce: "pre",
  49. include: [resolve('src'), resolve('test')],
  50. options: {
  51. formatter: require('eslint-friendly-formatter')
  52. }
  53. },
  54. {
  55. // 处理 vue文件
  56. // https://github.com/vuejs/vue-loader
  57. test: /\.vue$/,
  58. loader: 'vue-loader',
  59. options: vueLoaderConfig
  60. },
  61. {
  62. // 编译 js
  63. // https://github.com/babel/babel-loader
  64. test: /\.js$/,
  65. loader: 'babel-loader',
  66. include: [resolve('src'), resolve('test')]
  67. },
  68. {
  69. // 处理图片文件
  70. // https://github.com/webpack-contrib/url-loader
  71. test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
  72. loader: 'url-loader',
  73. query: {
  74. limit: 10000,
  75. name: utils.assetsPath('img/[name].[hash:7].[ext]')
  76. }
  77. },
  78. {
  79. // 处理字体文件
  80. test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
  81. loader: 'url-loader',
  82. query: {
  83. limit: 10000,
  84. name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
  85. }
  86. }
  87. ]
  88. }
  89. }

config/index.js

该文件在很多文件中都用到,是主要的配置文件,包含静态文件的路径、是否开启sourceMap等。其中,分为两个部分dev(开发环境的配置)和build(生产环境的配置)。

  1. // 详情见文档:https://vuejs-templates.github.io/webpack/env.html
  2. var path = require('path')
  3. module.exports = {
  4. // production 生产环境
  5. build: {
  6. // 构建环境
  7. env: require('./prod.env'),
  8. // 构建输出的index.html文件
  9. index: path.resolve(__dirname, '../dist/index.html'),
  10. // 构建输出的静态资源路径
  11. assetsRoot: path.resolve(__dirname, '../dist'),
  12. // 构建输出的二级目录
  13. assetsSubDirectory: 'static',
  14. // 构建发布的根目录,可配置为资源服务器域名或 CDN 域名
  15. assetsPublicPath: '/',
  16. // 是否开启 cssSourceMap
  17. productionSourceMap: true,
  18. // Gzip off by default as many popular static hosts such as
  19. // Surge or Netlify already gzip all static assets for you.
  20. // Before setting to `true`, make sure to:
  21. // npm install --save-dev compression-webpack-plugin
  22. // 默认关闭 gzip,因为很多流行的静态资源主机,例如 Surge、Netlify,已经为所有静态资源开启gzip
  23. productionGzip: false,
  24. // 需要使用 gzip 压缩的文件扩展名
  25. productionGzipExtensions: ['js', 'css'],
  26. // Run the build command with an extra argument to
  27. // View the bundle analyzer report after build finishes:
  28. // `npm run build --report`
  29. // Set to `true` or `false` to always turn it on or off
  30. // 运行“build”命令行时,加上一个参数,可以在构建完成后参看包分析报告
  31. // true为开启,false为关闭
  32. bundleAnalyzerReport: process.env.npm_config_report
  33. },
  34. // dev 开发环境
  35. dev: {
  36. // 构建环境
  37. env: require('./dev.env'),
  38. // 端口号
  39. port: 3333,
  40. // 是否自动打开浏览器
  41. autoOpenBrowser: true,
  42. assetsSubDirectory: 'static',
  43. // 编译发布的根目录,可配置为资源服务器域名或 CDN 域名
  44. assetsPublicPath: '/',
  45. // proxyTable 代理的接口(可跨域)
  46. // 使用方法:https://vuejs-templates.github.io/webpack/proxy.html
  47. proxyTable: {},
  48. // CSS Sourcemaps off by default because relative paths are "buggy"
  49. // with this option, according to the CSS-Loader README
  50. // (https://github.com/webpack/css-loader#sourcemaps)
  51. // In our experience, they generally work as expected,
  52. // just be aware of this issue when enabling this option.
  53. // 默认情况下,关闭 CSS Sourcemaps,因为使用相对路径会报错。
  54. // CSS-Loader README:https://github.com/webpack/css-loader#sourcemaps
  55. cssSourceMap: false
  56. }
  57. }

utils.js

utils.js也是一个被使用频率的文件,这个文件包含了三个工具函数:

  • 生成静态资源的路径

  • 生成 ExtractTextPlugin对象或loader字符串

  • 生成 style-loader的配置

  1. // node自带的文件路径工具
  2. var path = require('path')
  3. // 配置文件
  4. var config = require('../config')
  5. // 提取css的插件
  6. // https://github.com/webpack-contrib/extract-text-webpack-plugin
  7. var ExtractTextPlugin = require('extract-text-webpack-plugin')
  8. /**
  9. * 生成静态资源的路径
  10. * @method assertsPath
  11. * @param {String} _path 相对于静态资源文件夹的文件路径
  12. * @return {String} 静态资源完整路径
  13. */
  14. exports.assetsPath = function (_path) {
  15. var assetsSubDirectory = process.env.NODE_ENV === 'production'
  16. ? config.build.assetsSubDirectory
  17. : config.dev.assetsSubDirectory
  18. // path.posix.join与path.join一样,不过总是以 posix 兼容的方式交互
  19. return path.posix.join(assetsSubDirectory, _path)
  20. }
  21. /**
  22. * 生成处理css的loaders配置
  23. * @method cssLoaders
  24. * @param {Object} options 生成配置
  25. * option = {
  26. * // 是否开启 sourceMap
  27. * sourceMap: true,
  28. * // 是否提取css
  29. * extract: true
  30. * }
  31. * @return {Object} 处理css的loaders配置对象
  32. */
  33. exports.cssLoaders = function (options) {
  34. options = options || {}
  35. var cssLoader = {
  36. loader: 'css-loader',
  37. options: {
  38. minimize: process.env.NODE_ENV === 'production',
  39. sourceMap: options.sourceMap
  40. }
  41. }
  42. /**
  43. * 生成 ExtractTextPlugin对象或loader字符串
  44. * @method generateLoaders
  45. * @param {Array} loaders loader名称数组
  46. * @return {String|Object} ExtractTextPlugin对象或loader字符串
  47. */
  48. function generateLoaders (loader, loaderOptions) {
  49. var loaders = [cssLoader]
  50. if (loader) {
  51. loaders.push({
  52. // 例如,sass?indentedSyntax
  53. // 在?号前加上“-loader”
  54. loader: loader + '-loader',
  55. options: Object.assign({}, loaderOptions, {
  56. sourceMap: options.sourceMap
  57. })
  58. })
  59. }
  60. // extract为true时,提取css
  61. // 生产环境中,默认为true
  62. if (options.extract) {
  63. return ExtractTextPlugin.extract({
  64. use: loaders,
  65. fallback: 'vue-style-loader'
  66. })
  67. } else {
  68. return ['vue-style-loader'].concat(loaders)
  69. }
  70. }
  71. // http://vuejs.github.io/vue-loader/en/configurations/extract-css.html
  72. return {
  73. css: generateLoaders(),
  74. postcss: generateLoaders(),
  75. less: generateLoaders('less'),
  76. sass: generateLoaders('sass', { indentedSyntax: true }),
  77. scss: generateLoaders('sass'),
  78. stylus: generateLoaders('stylus'),
  79. styl: generateLoaders('stylus')
  80. }
  81. }
  82. /**
  83. * 生成 style-loader的配置
  84. * style-loader文档:https://github.com/webpack/style-loader
  85. * @method styleLoaders
  86. * @param {Object} options 生成配置
  87. * option = {
  88. * // 是否开启 sourceMap
  89. * sourceMap: true,
  90. * // 是否提取css
  91. * extract: true
  92. * }
  93. * @return {Array} style-loader的配置
  94. */
  95. exports.styleLoaders = function (options) {
  96. var output = []
  97. var loaders = exports.cssLoaders(options)
  98. for (var extension in loaders) {
  99. var loader = loaders[extension]
  100. output.push({
  101. test: new RegExp('\\.' + extension + '$'),
  102. use: loader
  103. })
  104. }
  105. return output
  106. }

生产环境

开发环境的入口文件是build/build.js 

build.js

该文件,为构建打包文件,会将源码进行构建(编译、压缩等)后打包。

  1. // 设置当前环境为生产环境
  2. process.env.NODE_ENV = 'production'
  3. // loading 插件
  4. // https://github.com/sindresorhus/ora
  5. var ora = require('ora')
  6. // 可以在 node 中执行`rm -rf`的工具
  7. // https://github.com/isaacs/rimraf
  8. var rm = require('rimraf')
  9. // node自带的文件路径工具
  10. var path = require('path')
  11. // 在终端输出带颜色的文字
  12. // https://github.com/chalk/chalk
  13. var chalk = require('chalk')
  14. var webpack = require('webpack')
  15. // 配置文件
  16. var config = require('../config')
  17. var webpackConfig = require('./webpack.prod.conf')
  18. // 在终端显示loading效果,并输出提示
  19. var spinner = ora('building for production...')
  20. spinner.start()
  21. // 删除这个文件夹 (递归删除)
  22. rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
  23. if (err) throw err
  24. // 构建
  25. webpack(webpackConfig, function (err, stats) {
  26. // 构建成功
  27. // 停止 loading动画
  28. spinner.stop()
  29. if (err) throw err
  30. process.stdout.write(stats.toString({
  31. colors: true,
  32. modules: false,
  33. children: false,
  34. chunks: false,
  35. chunkModules: false
  36. }) + '\n\n')
  37. // 打印提示
  38. console.log(chalk.cyan(' Build complete.\n'))
  39. console.log(chalk.yellow(
  40. ' Tip: built files are meant to be served over an HTTP server.\n' +
  41. ' Opening index.html over file:// won\'t work.\n'
  42. ))
  43. })
  44. })

webpack.prod.conf

该文件,为生产环境中webpack的配置入口。同时,它也依赖于前面提到的webpack.base.conf.jsutils.jsconfig/index.js

  1. // node自带的文件路径工具
  2. var path = require('path')
  3. // 工具函数集合
  4. var utils = require('./utils')
  5. var webpack = require('webpack')
  6. // 配置文件
  7. var config = require('../config')
  8. // webpack 配置合并插件
  9. var merge = require('webpack-merge')
  10. // webpack 基本配置
  11. var baseWebpackConfig = require('./webpack.base.conf')
  12. // webpack 复制文件和文件夹的插件
  13. // https://github.com/kevlened/copy-webpack-plugin
  14. var CopyWebpackPlugin = require('copy-webpack-plugin')
  15. // 自动生成 html 并且注入到 .html 文件中的插件
  16. // https://github.com/ampedandwired/html-webpack-plugin
  17. var HtmlWebpackPlugin = require('html-webpack-plugin')
  18. // 提取css的插件
  19. // https://github.com/webpack-contrib/extract-text-webpack-plugin
  20. var ExtractTextPlugin = require('extract-text-webpack-plugin')
  21. // webpack 优化压缩和优化 css 的插件
  22. // https://github.com/NMFR/optimize-css-assets-webpack-plugin
  23. var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')

 

vue-cli webpack配置 简单分析的更多相关文章

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

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

  2. Vue CLI 3.x 简单体验

    文档 中文文档 补充于02月10日 vue脚手架的3.x版本已经在开发中,现在还处于alpha版本.我们来看看有哪些变化. 使用 npm install -g @vue/cli 命名方式已经改为npm ...

  3. [Vue CLI 3] 配置 webpack-bundle-analyzer 插件

    首先还是简单介绍一下 webpack-bundle-analyzer 是做什么的: Visualize size of webpack output files with an interactive ...

  4. Vue CLI Webpack 创建Vue项目

    简介 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手,还 ...

  5. @vue/cli的配置知道多少-publicPath,outputDir,assetsDir,indexPath,filenameHashing,configureWebpack,productionSourceMap

    vue.config.js的简单介绍 vue.config.js 是一个可选的配置文件, 在项目的 (和 package.json 同级的) 根目录中存在这个文件. 默认情况没有这个文件需要我们手动去 ...

  6. [Vue CLI 3] 配置解析之 indexPath

    在 vue.config.js 配置中有一个 indexPath 的配置,我们先看看它有什么用? 用来指定 index.html 最终生成的路径(相对于 outputDir) 先看看它的默认值:在文件 ...

  7. 使用vue/cli 创建一个简单的项目

    首先,电脑安装了node.js官方要求8.9 或更高版本 (推荐 8.11.0+) npm install -g @vue/cli # OR yarn global add @vue/cli 全局安装 ...

  8. [Vue CLI 3] 配置解析之 parallel

    官方文档中介绍过在 vue.config.js 文件中可以配置 parallel,作用如下: 是否为 Babel 或 TypeScript 使用 thread-loader. 该选项在系统的 CPU ...

  9. Vue CLI 3 配置兼容IE10

    最近做了一个基于Vue的项目,需要兼容IE浏览器,目前实现了打包后可以在IE10以上运行,但是还不支持在运行时兼容IE10及以上. 安装依赖 yarn add --dev @babel/polyfil ...

随机推荐

  1. tab切换的效果——仿照今日头条APP的切换效果

    说点废话;不知道是哪一版本起头条的tab切换效果就变了,一直琢磨着这个事,去度娘那里也没有什么结果:正好这两天有空就尝试做了一下:用前端的技术来实现: 先看效果吧:上面的tab随着slide滑动,上面 ...

  2. 错误:软件包:3:docker-ce-18.09.4-3.el7.x86_64 (docker-ce-stable) 需要:container-selinux >= 2.9

    命令:yum -y install http://mirror.centos.org/centos/7/extras/x86_64/Packages/container-selinux-2.68-1. ...

  3. go语言time包的使用

    时间类型 time.Time类型表示时间. //时间类型 func timeDemo() { now := time.Now() fmt.Println(now) //2019-04-20 13:52 ...

  4. charls 抓包

    一.HTTPS原理: HTTPS(Hyper Text Transfer Protocol Secure),是一种基于SSL/TLS的HTTP,所有的HTTP数据都是在SSL/TLS协议封装之上进行传 ...

  5. Spring Cloud Zuul 中文文件上传乱码

    原文地址:https://segmentfault.com/a/1190000011650034 1 描述 使用Spring Cloud Zuul进行路由转发时候吗,文件上传会造成中文乱码“?”.1. ...

  6. phpstudy-5.6.27-nts 安装redis扩展

    redis扩展安装流程 第一步: 首先直接查看一下phpinfo()的信息 找到下面两条信息 Architecture x86 PHP Extension Build API20131226,NTS, ...

  7. 重写Java中包装类的方法

    知识点一.Object类Object是所有类的父类.Object中的方法有:toString() 描述对象的信息,需要重写.System.out.println在打印对象的时候会默认调用对象的toSt ...

  8. 骨灰级玩家体验带你测试体验天使纪元OL折扣端

    刘亦菲代言吸引了我才进入游戏的(不知道有多少人和我一样)这个游戏没有一些骨灰级玩家带,真的很费时间费钱.   天使纪元5折折扣端(点击下载),其实是一个良心老平台,苹果,安卓.H5都支持的平台,采用最 ...

  9. Java链接MySQL数据库的配置文件

    文件名:db.properties(随便) driver = com.mysql.jdbc.Driver  //MySQL数据库驱动名url = jdbc:mysql://localhost:3306 ...

  10. Java 问题定位工具 ——jstack

    简介 jstack 主要用于生成虚拟机当前时刻的「线程快照」.线程快照是当前 Java 虚拟机每一条线程正在执行的方法堆栈的集合. 生成线程快照的主要目的是用于定位线程出现长时间停顿的原因,如线程间死 ...