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

  1. 这个配置文件是命令npm run build 的入口配置文件,主要用于生产环境
  2. 由于这是一个系统的配置文件,将涉及很多的模块和插件,所以这部分内容我将分多个文章讲解,请关注我博客的其他文章
 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 片段

Vue简单介绍

vue2.0 代码功能片段

master节点的部署介绍和前置工作

基于Vue+Less+axios封装+ElementUI搭建项目底层支撑实战

片段中的 Android 相机预览