vue - 前置工作 - 目录功能介绍
Posted Sunsin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue - 前置工作 - 目录功能介绍相关的知识,希望对你有一定的参考价值。
一个DEMOS的完整目录(由于GWF问题,我就不一一打开网站一个个去搜索并且解释了)可以去关注:https://www.cnblogs.com/ye-hcj
build
build.js(本文来自https://www.cnblogs.com/ye-hcj/p/7096341.html)
- 这个配置文件是命令
npm run build
的入口配置文件,主要用于生产环境 - 由于这是一个系统的配置文件,将涉及很多的模块和插件,所以这部分内容我将分多个文章讲解,请关注我博客的其他文章
1 // npm和node版本检查,请看我的check-versions配置文件解释文章require(\'./check-versions\')()
2
3 // 设置环境变量为production
4 process.env.NODE_ENV = \'production\'
5
6 // ora是一个命令行转圈圈动画插件,好看用的
7 var ora = require(\'ora\')
8 // rimraf插件是用来执行UNIX命令rm和-rf的用来删除文件夹和文件,清空旧的文件
9 var rm = require(\'rimraf\')
10 // node.js路径模块
11 var path = require(\'path\')
12 // chalk插件,用来在命令行中输入不同颜色的文字
13 var chalk = require(\'chalk\')
14 // 引入webpack模块使用内置插件和webpack方法
15 var webpack = require(\'webpack\')
16 // 引入config下的index.js配置文件,此配置文件我之前介绍了请自行查阅,主要配置的是一些通用的选项
17 var config = require(\'../config\')
18 // 下面是生产模式的webpack配置文件,请看我的webpack.prod.conf解释文章
19 var webpackConfig = require(\'./webpack.prod.conf\')
20
21 // 开启转圈圈动画
22 var spinner = ora(\'building for production...\')
23 spinner.start()
24
25 // 调用rm方法,第一个参数的结果就是 dist/static,表示删除这个路径下面的所有文件
26 rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
27 // 如果删除的过程中出现错误,就抛出这个错误,同时程序终止
28 if (err) throw err
29 // 没有错误,就执行webpack编译
30 webpack(webpackConfig, function (err, stats) {
31 // 这个回调函数是webpack编译过程中执行
32 spinner.stop() // 停止转圈圈动画
33 if (err) throw err // 如果有错误就抛出错误
34 // 没有错误就执行下面的代码,process.stdout.write和console.log类似,输出对象
35 process.stdout.write(stats.toString({
36 // stats对象中保存着编译过程中的各种消息
37 colors: true, // 增加控制台颜色开关
38 modules: false, // 不增加内置模块信息
39 children: false, // 不增加子级信息
40 chunks: false, // 允许较少的输出
41 chunkModules: false // 不将内置模块的信息加到包信息
42 }) + \'\\n\\n\')
43 // 以上就是在编译过程中,持续打印消息
44 // 下面是编译成功的消息
45 console.log(chalk.cyan(\' Build complete.\\n\'))
46 console.log(chalk.yellow(
47 \' Tip: built files are meant to be served over an HTTP server.\\n\' +
48 \' Opening index.html over file:// won\\\'t work.\\n\'
49 ))
50 })
51 })
webpack官方文档:https://webpack.js.org/concepts/
check-versions.js(本文来自https://www.cnblogs.com/ye-hcj/p/7096341.html)
1 / 下面的插件是chalk插件,他的作用是在控制台中输出不同的颜色的字,大致这样用chalk.blue(\'Hello world\'),这款插件只能改变命令行中的字体颜色
2 var chalk = require(\'chalk\')
3 // 下面这个是semver插件,是用来对特定的版本号做判断的,比如
4 // semver.gt(\'1.2.3\',\'9.8.7\') false 1.2.3版本比9.8.7版本低
5 // semver.satisfies(\'1.2.3\',\'1.x || >=2.5.0 || 5.0.0 - 7.2.3\') true 1.2.3的版本符合后面的规则
6 var semver = require(\'semver\')
7 // 下面是导入package.json文件,要使用里面的engines选项,要注意require是直接可以导入json文件的,并且requrie返回的就是json对象
8 var packageConfig = require(\'../package.json\')
9 // 下面这个插件是shelljs,作用是用来执行Unix系统命令
10 var shell = require(\'shelljs\')
11 // 下面涉及了很多Unix命令,这里可能解释的不够详细,第一时间精力有限,第二能力有限。。。
12 function exec (cmd) {
13 //脚本可以通过 child_process 模块新建子进程,从而执行 Unix 系统命令
14 //下面这段代码实际就是把cmd这个参数传递的值转化成前后没有空格的字符串,也就是版本号
15 return require(\'child_process\').execSync(cmd).toString().trim()
16 }
17
18 var versionRequirements = [
19 {
20 name: \'node\', // node版本的信息
21 currentVersion: semver.clean(process.version), // 使用semver插件吧版本信息转化成规定格式,也就是 \' =v1.2.3 \' -> \'1.2.3\' 这种功能
22 versionRequirement: packageConfig.engines.node // 这是规定的pakage.json中engines选项的node版本信息 "node":">= 4.0.0"
23 },
24 ]
25
26 if (shell.which(\'npm\')) {
27 versionRequirements.push({
28 name: \'npm\',
29 currentVersion: exec(\'npm --version\'), // 自动调用npm --version命令,并且把参数返回给exec函数,从而获取纯净的版本号
30 versionRequirement: packageConfig.engines.npm // 这是规定的pakage.json中engines选项的node版本信息 "npm": ">= 3.0.0"
31 })
32 }
33
34 module.exports = function () {
35 var warnings = []
36 for (var i = 0; i < versionRequirements.length; i++) {
37 var mod = versionRequirements[i]
38 if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
39 //上面这个判断就是如果版本号不符合package.json文件中指定的版本号,就执行下面的代码
40 warnings.push(mod.name + \': \' +
41 chalk.red(mod.currentVersion) + \' should be \' +
42 chalk.green(mod.versionRequirement)
43 // 大致意思就是 把当前版本号用红色字体 符合要求的版本号用绿色字体 给用户提示具体合适的版本
44 )
45 }
46 }
47
48 if (warnings.length) {
49 console.log(\'\')
50 console.log(chalk.yellow(\'To use this template, you must update following to modules:\'))
51 console.log()
52 for (var i = 0; i < warnings.length; i++) {
53 var warning = warnings[i]
54 console.log(\' \' + warning)
55 }
56 console.log()
57 process.exit(1)
58 // 提示用户更新版本,具体不解释了,应该能看懂
59 }
60 }
vue-loader.conf.js(本博客)
1 \'use strict\'
2 const utils = require(\'./utils\')
3 const config = require(\'../config\')
4 const isProduction = process.env.NODE_ENV === \'production\'
5 const sourceMapEnabled = isProduction ?
6 config.build.productionSourceMap :
7 config.dev.cssSourceMap
8
9 module.exports = {
10 // css加载器
11 loaders: utils.cssLoaders({
12 sourceMap: sourceMapEnabled,
13 extract: isProduction
14 }),
15 cssSourceMap: sourceMapEnabled,
16 cacheBusting: config.dev.cacheBusting,
17 //css编译之类
18 transformToRequire: {
19 video: [\'src\', \'poster\'],
20 source: \'src\',
21 img: \'src\',
22 image: \'xlink:href\'
23 }
24 }
详细使用,就不多说了,已经有一个示例了!
webpack.base.conf.js
1 \'use strict\' 2 const path = require(\'path\') 3 const utils = require(\'./utils\') 4 const config = require(\'../config\') 5 const vueLoaderConfig = require(\'./vue-loader.conf\') 6 7 function resolve(dir) { 8 return path.join(__dirname, \'..\', dir) 9 } 10 11 12 // 控制生成以及src目录 13 14 // 详细webpack配置,请看官方文档 15 module.exports = { 16 context: path.resolve(__dirname, \'../\'), 17 // 入口 18 entry: { 19 app: \'./src/main.js\' 20 }, 21 // 出口 22 output: { 23 path: config.build.assetsRoot, 24 filename: \'[name].js\', 25 publicPath: process.env.NODE_ENV === \'production\' ? 26 config.build.assetsPublicPath : config.dev.assetsPublicPath 27 }, 28 resolve: { 29 extensions: [\'.js\', \'.vue\', \'.json\'], 30 alias: { 31 \'vue$\': \'vue/dist/vue.esm.js\', 32 \'@\': resolve(\'src\'), 33 } 34 }, 35 module: { 36 // 各种模块加载(vue,js,png等) 37 rules: [{ 38 test: /\\.vue$/, 39 loader: \'vue-loader\', 40 options: vueLoaderConfig 41 }, 42 { 43 test: /\\.js$/, 44 loader: \'babel-loader\', 45 include: [resolve(\'src\'), resolve(\'test\'), resolve(\'node_modules/webpack-dev-server/client\')] 46 }, 47 { 48 test: /\\.(png|jpe?g|gif|svg)(\\?.*)?$/, 49 loader: \'url-loader\', 50 options: { 51 limit: 10000, 52 name: utils.assetsPath(\'img/[name].[hash:7].[ext]\') 53 } 54 }, 55 { 56 test: /\\.(mp4|webm|ogg|mp3|wav|flac|aac)(\\?.*)?$/, 57 loader: \'url-loader\', 58 options: { 59 limit: 10000, 60 name: utils.assetsPath(\'media/[name].[hash:7].[ext]\') 61 } 62 }, 63 { 64 test: /\\.(woff2?|eot|ttf|otf)(\\?.*)?$/, 65 loader: \'url-loader\', 66 options: { 67 limit: 10000, 68 name: utils.assetsPath(\'fonts/[name].[hash:7].[ext]\') 69 } 70 } 71 ] 72 }, 73 node: { 74 // prevent webpack from injecting useless setImmediate polyfill because Vue 75 // source contains it (although only uses it if it\'s native). 76 setImmediate: false, 77 // prevent webpack from injecting mocks to Node native modules 78 // that does not make sense for the client 79 dgram: \'empty\', 80 fs: \'empty\', 81 net: \'empty\', 82 tls: \'empty\', 83 child_process: \'empty\' 84 } 85 }
webpack.dev.conf.js
1 \'use strict\' 2 const utils = require(\'./utils\') 3 const webpack = require(\'webpack\') 4 const config = require(\'../config\') 5 // 一个可以合并数组和对象的插件 6 const merge = require(\'webpack-merge\') 7 const path = require(\'path\') 8 const baseWebpackConfig = require(\'./webpack.base.conf\') 9 const CopyWebpackPlugin = require(\'copy-webpack-plugin\') 10 // 一个用于生成HTML文件并自动注入依赖文件(link/script)的webpack插件 11 const HtmlWebpackPlugin = require(\'html-webpack-plugin\') 12 // 用于更友好地输出webpack的警告、错误等信息 13 const FriendlyErrorsPlugin = require(\'friendly-errors-webpack-plugin\') 14 const portfinder = require(\'portfinder\') 15 16 const HOST = process.env.HOST 17 const PORT = process.env.PORT && Number(process.env.PORT) 18 // 合并基础的webpack配置 19 const devWebpackConfig = merge(baseWebpackConfig, { 20 module: { 21 rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) 22 }, 23 // cheap-module-eval-source-map is faster for development 24 // 配置Source Maps。在开发中使用cheap-module-eval-source-map更快 25 devtool: config.dev.devtool, 26 27 // 这些devServer选项应该在/config/index.js中定制 28 devServer: { 29 clientLogLevel: \'warning\', 30 historyApiFallback: { 31 rewrites: [ 32 { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, \'index.html\') }, 33 ], 34 }, 35 hot: true, 36 contentBase: false, // 因为我们使用CopyWebpackPlugin必需 37 compress: true, 38 host: HOST || config.dev.host, 39 port: PORT || config.dev.port, 40 open: config.dev.autoOpenBrowser, 41 overlay: config.dev.errorOverlay ? { warnings: false, errors: true } : false, 42 publicPath: config.dev.assetsPublicPath, 43 proxy: config.dev.proxyTable, 44 quiet: true, // FriendlyErrorsPlugin必需 45 watchOptions: { 46 poll: config.dev.poll, 47 } 48 }, 49 plugins: [ 50 new webpack.DefinePlugin({ 51 \'process.env\': require(\'../config/dev.env\') 52 }), 53 new webpack.HotModuleReplacementPlugin(), 54 new webpack.NamedModulesPlugin(), // HMR在更新控制台上显示正确的文件名. 55 new webpack.NoEmitOnErrorsPlugin(), 56 // https://github.com/ampedandwired/html-webpack-plugin 57 new HtmlWebpackPlugin({ 58 filename: \'index.html\', 59 template: \'index.html\', 60 inject: true 61 }), 62 // 复制自定义静态assets 63 new CopyWebpackPlugin([{ 64 from: path.resolve(__dirname, \'../static\'), 65 to: config.dev.assetsSubDirectory, 66 ignore: [\'.*\'] 67 }]) 68 ] 69 }) 70 71 module.exports = new Promise((resolve, reject) => { 72 portfinder.basePort = process.env.PORT || config.dev.port 73 portfinder.getPort((err, port) => { 74 if (err) { 75 reject(err) 76 } else { 77 // 发布e2e测试所需的新端口 78 process.env.PORT = port 79 // 添加端口配置服务 80 devWebpackConfig.devServer.port = port 81 82 // 添加友好错误的插件 83 devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ 84 compilationSuccessInfo: { 85 messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`], 86 }, 87 onErrors: config.dev.notifyOnErrors ? 88 utils.createNotifierCallback() : undefined 89 })) 90 91 resolve(devWebpackConfig) 92 } 93 }) 94 })
wepack.prod.conf.js
1 // 引入依赖模块 2 var path = require(\'path\') 3 var utils = require(\'./utils\') 4 var webpack = require(\'webpack\') 5 // 引入基本配置 6 var config = require(\'../config\') 7 var merge = require(\'webpack-merge\') 8 var baseWebpackConfig = require(\'./webpack.base.conf\') 9 var HtmlWebpackPlugin = require(\'html-webpack-plugin\') 10 11 // 用于从webpack生成的bundle中提取文本到特定文件中的插件 12 // 可以抽取出css,js文件将其与webpack输出的bundle分离 13 14 var ExtractTextPlugin = require(\'extract-text-webpack-plugin\') 15 16 var env = process.env.NODE_ENV === \'testing\' ? 17 require(\'../config/test.env\') : 18 config.build.env 19 20 // 合并基础的webpack配置 21 var webpackConfig = merge(baseWebpackConfig, { 22 module: { 23 rules: utils.styleLoaders({ 24 sourceMap: config.build.productionSourceMap, 25 extract: true 26 }) 27 }, 28 29 devtool: config.build.productionSourceMap ? \'#source-map\' : false, 30 // 配置webpack的输出 31 output: { 32 // 编译输出目录 33 path: config.build.assetsRoot, 34 // 编译输出文件名格式 35 filename: utils.assetsPath(\'js/[name].[chunkhash].js\'), 36 // 没有指定输出名的文件输出的文件名格式 37 chunkFilename: utils.assetsPath(\'js/[id].[chunkhash].js\') 38 }, 39 40 // 配置webpack插件 41 42 plugins: [ 43 // http://vuejs.github.io/vue-loader/en/workflow/production.html 44 new webpack.DefinePlugin({ 45 \'process.env\': env 46 }), 47 48 // 丑化压缩代码 49 new webpack.optimize.UglifyJsPlugin({ 50 compress: { 51 warnings: false 52 }, 53 sourceMap: true 54 }), 55 56 57 58 // 抽离css文件 59 new ExtractTextPlugin({ 60 filename: utils.assetsPath(\'css/[name].[contenthash].css\') 61 }), 62 63 64 65 // generate dist index.html with correct asset hash for caching. 66 // you can customize output by editing /index.html 67 // see https://github.com/ampedandwired/html-webpack-plugin 68 new HtmlWebpackPlugin({ 69 filename: process.env.NODE_ENV === \'testing\' 70 71 ? 72 \'index.html\' : 73 config.build.index, 74 template: \'index.html\', 75 inject: true, 76 minify: { 77 removeComments: true, 78 collapseWhitespace: true, 79 removeAttributeQuotes: true 80 // more options: 81 // https://github.com/kangax/html-minifier#options-quick-reference 82 }, 83 84 // necessary to consistently work with multiple chunks via CommonsChunkPlugin 85 chunksSortMode: \'dependency\' 86 }), 87 88 // split vendor js into its own file 89 new webpack.optimize.CommonsChunkPlugin({ 90 name: \'vendor\', 91 minChunks: function(module, count) { 92 // any required modules inside node_modules are extracted to vendor 93 94 return ( 95 module.resource && 96 /\\.js$/.test(module.resource) && 97 module.resource.indexOf( 98 path.join(__dirname, \'../node_modules\') 99 ) === 0 100 ) 101 } 102 }), 103 // extract webpack runtime and module manifest to its own file in order to 104 // prevent vendor hash from being updated whenever app bundle is updated 105 106 new webpack.optimize.CommonsChunkPlugin({ 107 name: \'manifest\', 108 chunks: [\'vendor\'] 109 }) 110 ] 111 }) 112 113 // gzip模式下需要引入compression插件进行压缩 使用带有渲染功能的 Vue.js 3 片段