1.适用人群

  1. 1.webpack知识有一定了解但不熟悉的同学.
  2. 2.女同学!!!(233333....)

2.目的

  1. 在自己对webpack有进一步了解的同时,也希望能帮到一些刚接触webpack的同学.
  1. 脚手架已放上github,不想听我啰嗦的同学可以直接去downloadclone下来看哦.
  2. 脚手架里都有详细注释!

https://github.com/webfansplz...

觉得有帮助到你的同学给个star哈,也算是对我的一种支持!

3.脚手架结构

  1. ├── build 构建服务和webpack配置
  2. |—— build.js webpack打包服务
  3. |—— webpack.base.conf.js webpack基本通用配置
  4. |—— webpack.dev.conf.js webpack开发环境配置
  5. |—— webpack.prod.conf.js webpack生产环境配置
  6. ├── config 构建项目不同环境的配置
  7. ├── public 项目打包文件存放目录
  8. ├── index.html 项目入口文件
  9. ├── package.json 项目配置文件
  10. ├── static 静态资源
  11. ├── .babelrc babel配置文件
  12. ├── .gitignore git忽略文件
  13. ├── postcss.config.js postcss配置文件
  14. ├── src 项目目录
  15. |—— page 页面组件目录
  16. |—— router vue路由配置
  17. |—— store vuex配置
  18. |—— App.vue vue实例入口
  19. |—— main.js 项目构建入口

4.配置npm scripts

4.1 生成package.json文件,配置npm scripts.

4.1.1 使用 npm init 命令,生成一个package.json文件!

  1. npm init

4.1.2 全局安装webpack和webpack-dev-server

  1. npm install webpack webpack-dev-server -g

4.1.3 在项目目录下安装webpack和webpack-dev-server

  1. npm install webpack webpack-dev-server -D

4.1.4 进入package.json配置npm scripts命令

  1. "scripts": {
  2. "dev": "webpack-dev-server --config build/webpack.dev.conf.js",
  3. "start": "npm run dev",
  4. "build": "node build/build.js"
  5. }
  6. 通过配置以上命令:
  7. 我们可以通过npm start/npm run dev在本地进行开发,
  8. scripts.dev命令解读:
  9. 通过webpack-dev-server命令 启动build文件夹下webpack.dev.conf.js
  10. 也可以通过npm run build 打包项目文件进行线上部署.
  11. scripts.build命令解读:
  12. 通过node命令构建build文件夹下的build.js
  13. 命令的配置可以根据自己脚手架的配置文件位置和名称不同修改哦!

5.构建脚手架目录

  1. 同学们可以通过自己的习惯和喜爱搭建自己的脚手架目录,下面讲解以上面脚手架结构为准!

6.构建config/config.js

6.1 该文件主要用来配置构建开发环境和生产环境差异化的参数.
6.2

  1. const _path = require("path");
  2. const ExtractTextPlugin = require("extract-text-webpack-plugin");
  3. //vue-loader基本配置
  4. const baseVueLoaderConf = {
  5. //引入postcss插件
  6. postcss: {
  7. config: {
  8. path: _path.resolve("../")
  9. }
  10. },
  11. //转为require调用,让webpack处理目标资源!
  12. transformToRequire: {
  13. video: "src",
  14. source: "src",
  15. img: "src",
  16. image: "xlink:href"
  17. }
  18. };
  19. //vue-loader 开发环境配置
  20. const devVueLoaderConf = Object.assign({}, baseVueLoaderConf, {
  21. //loaders
  22. loaders: {
  23. css: ["vue-style-loader", "css-loader"],
  24. less: ["vue-style-loader", "css-loader", "postcss-loader", "less-loader"]
  25. },
  26. cssSourceMap: true
  27. });
  28. //vue-loader 生产环境配置
  29. const buildVueLoaderConf = Object.assign({}, baseVueLoaderConf, {
  30. //loaders
  31. loaders: ExtractTextPlugin.extract({
  32. use: ["css-loader", "postcss-loader", "less-loader"],
  33. fallback: "vue-style-loader"
  34. }),
  35. cssSourceMap: false
  36. });
  37. //开发/生产环境 配置参数!
  38. module.exports = {
  39. dev: {
  40. publicPath: "/",
  41. devtoolType: "cheap-module-eval-source-map",
  42. vueloaderConf: devVueLoaderConf,
  43. host: "localhost",
  44. port: "1234",
  45. proxyTable: {}
  46. },
  47. build: {
  48. publicPath: "/",
  49. devtoolType: "source-map",
  50. vueloaderConf: buildVueLoaderConf,
  51. staticPath: "static"
  52. }
  53. };

7.构建build/webpack.base.conf.js

7.1 此文件主要是webpack开发环境和生成环境的通用配置.

7.2

  1. "use strict";
  2. //引入node path路径模块
  3. const path = require("path");
  4. //引入webpack生产环境配置参数
  5. const prodConfig = require("../config").build;
  6. //拼接路径
  7. function resolve(track) {
  8. return path.join(__dirname, "..", track);
  9. }
  10. //资源路径
  11. function assetsPath(_path) {
  12. return path.join(prodConfig.staticPath, _path);
  13. }
  14. //webpack 基本设置
  15. module.exports = {
  16. //项目入口文件->webpack从此处开始构建!
  17. entry: path.resolve(__dirname, "../src/main.js"),
  18. //配置模块如何被解析
  19. resolve: {
  20. //自动解析文件扩展名(补全文件后缀)(从左->右)
  21. // import hello from './hello' (!hello.js? -> !hello.vue? -> !hello.json)
  22. extensions: [".js", ".vue", ".json"],
  23. //配置别名映射
  24. alias: {
  25. // import Vue from 'vue/dist/vue.esm.js'可以写成 import Vue from 'vue'
  26. // 键后加上$,表示精准匹配!
  27. vue$: "vue/dist/vue.esm.js",
  28. "@": resolve("src"),
  29. utils: resolve("src/utils"),
  30. components: resolve("src/components"),
  31. public: resolve("public")
  32. }
  33. },
  34. module: {
  35. //处理模块的规则(可在此处使用不同的loader来处理模块!)
  36. rules: [
  37. //使用babel-loader来处理src下面的所有js文件,具体babel配置在.babelrc,主要是用来转义es6
  38. {
  39. test: /\.js$/,
  40. use: {
  41. loader: "babel-loader"
  42. },
  43. include: resolve("src")
  44. },
  45. //使用url-loader(file-loader的一个再封装)对引入的图片进行编码,此处可将小于8192字节(8kb)的图片转为DataURL(base64),
  46. //大于limit字节的会调用file-loader进行处理!
  47. //图片一般发布后都是长缓存,故此处文件名加入hash做版本区分!
  48. {
  49. test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
  50. loader: "url-loader",
  51. options: {
  52. limit: 8192,
  53. name: assetsPath("img/[name].[hash:8].[ext]")
  54. }
  55. }
  56. ]
  57. }
  58. };

8.构建 build/webpack.dev.conf.js

8.1 该文件主要用于构建开发环境

8.2

  1. "use strict";
  2. //引入node path路径模块
  3. const path = require("path");
  4. //引入webpack
  5. const webpack = require("webpack");
  6. //引入webpack开发环境配置参数
  7. const devConfig = require("../config").dev;
  8. //引入webpack基本配置
  9. const baseConf = require("./webpack.base.conf");
  10. //一个webpack配置合并模块,可简单的理解为与Object.assign()功能类似!
  11. const merge = require("webpack-merge");
  12. //一个创建html入口文件的webpack插件!
  13. const HtmlWebpackPlugin = require("html-webpack-plugin");
  14. //一个编译提示的webpack插件!
  15. const FriendlyErrorsPlugin = require("friendly-errors-webpack-plugin");
  16. //发送系统通知的一个node模块!
  17. const notifier = require("node-notifier");
  18. //将webpack基本配置与开发环境配置合并!
  19. const devConf = merge(baseConf, {
  20. //项目出口,webpack-dev-server 生成的包并没有写入硬盘,而是放在内存中!
  21. output: {
  22. //文件名
  23. filename: "[name].js",
  24. //html引用资源路径,在dev-server中,引用的是内存中文件!
  25. publicPath: devConfig.publicPath
  26. },
  27. //生成sourceMaps(方便调试)
  28. devtool: devConfig.devtoolType,
  29. //
  30. //启动一个express服务器,使我们可以在本地进行开发!!!
  31. devServer: {
  32. //HMR控制台log等级
  33. clientLogLevel: "warning",
  34. // 热加载
  35. hot: true,
  36. //自动刷新
  37. inline: true,
  38. //自动打开浏览器
  39. open: true,
  40. //在开发单页应用时非常有用,它依赖于HTML5 history API,如果设置为true,所有的跳转将指向index.html
  41. historyApiFallback: true,
  42. //主机名
  43. host: devConfig.host,
  44. //端口号
  45. port: devConfig.port,
  46. //配置反向代理解决跨域
  47. proxy: devConfig.proxyTable,
  48. //为你的代码进行压缩。加快开发流程和优化的作用
  49. compress: true,
  50. // 在浏览器上全屏显示编译的errors或warnings。
  51. overlay: {
  52. errors: true,
  53. warnings: false
  54. },
  55. // 终端输出的只有初始启动信息。 webpack 的警告和错误是不输出到终端的
  56. quiet: true
  57. },
  58. module: {
  59. //处理模块的规则(可在此处使用不同的loader来处理模块!)
  60. rules: [
  61. //使用vue-loader处理以vue结尾的文件!
  62. {
  63. test: /\.vue$/,
  64. loader: "vue-loader",
  65. options: devConfig.vueloaderConf
  66. },
  67. //使用vue-style-loader!css-loader!postcss-loader处理以css结尾的文件!
  68. {
  69. test: /\.css$/,
  70. use: [
  71. "vue-style-loader",
  72. {
  73. loader: "css-loader",
  74. options: {
  75. sourceMap: true
  76. }
  77. },
  78. {
  79. loader: "postcss-loader",
  80. options: {
  81. sourceMap: true
  82. }
  83. }
  84. ]
  85. },
  86. //使用vue-style-loader!css-loader!postcss-loader处理以less结尾的文件!
  87. {
  88. test: /\.less$/,
  89. use: [
  90. "vue-style-loader",
  91. {
  92. loader: "css-loader",
  93. options: {
  94. sourceMap: true
  95. }
  96. },
  97. {
  98. loader: "less-loader",
  99. options: {
  100. sourceMap: true
  101. }
  102. },
  103. {
  104. loader: "postcss-loader",
  105. options: {
  106. sourceMap: true
  107. }
  108. }
  109. ]
  110. }
  111. ]
  112. },
  113. plugins: [
  114. //开启HMR(热替换功能,替换更新部分,不重载页面!)
  115. new webpack.HotModuleReplacementPlugin(),
  116. //显示模块相对路径
  117. new webpack.NamedModulesPlugin(),
  118. //编译出错时,该插件可跳过输出,确保输出资源不会包含错误!
  119. // new webpack.NoEmitOnErrorsPlugin(),
  120. //配置html入口信息
  121. new HtmlWebpackPlugin({
  122. title: "hello,xc-cli!",
  123. filename: "index.html",
  124. template: "index.html",
  125. //js资源插入位置,true表示插入到body元素底部
  126. inject: true
  127. }),
  128. //编译提示插件
  129. new FriendlyErrorsPlugin({
  130. //编译成功提示!
  131. compilationSuccessInfo: {
  132. messages: [
  133. `Your application is running here: http://${devConfig.host}:${devConfig.port}`
  134. ]
  135. },
  136. //编译出错!
  137. onErrors: function(severity, errors) {
  138. if (severity !== "error") {
  139. return;
  140. }
  141. const error = errors[0];
  142. const filename = error.file.split("!").pop();
  143. //编译出错时,右下角弹出错误提示!
  144. notifier.notify({
  145. title: "xc-cli",
  146. message: severity + ": " + error.name,
  147. subtitle: filename || "",
  148. icon: path.join(__dirname, "xc-cli.png")
  149. });
  150. }
  151. })
  152. ]
  153. });
  154. module.exports = devConf;

8.3 通过创建以上文件,并下载相应的依赖和创建项目入口,我们就可以通过npm run dev在本地开发vue项目啦!!!

9.创建 build/webpack.prod.conf.js

9.1 此文件主要用于构建生产环境的配置.
9.2

  1. "use strict";
  2. //引入node path路径模块
  3. const path = require("path");
  4. //引入webpack
  5. const webpack = require("webpack");
  6. //一个webpack配置合并模块,可简单的理解为与Object.assign()功能类似!
  7. const merge = require("webpack-merge");
  8. //引入webpack生产环境配置参数
  9. const prodConfig = require("../config").build;
  10. //引入webpack基本配置
  11. const baseConf = require("./webpack.base.conf");
  12. //一个创建html入口文件的webpack插件!
  13. const HtmlWebpackPlugin = require("html-webpack-plugin");
  14. //一个抽离出css的webpack插件!
  15. const ExtractTextPlugin = require("extract-text-webpack-plugin");
  16. //一个压缩css的webpack插件!
  17. const OptimizeCSSPlugin = require("optimize-css-assets-webpack-plugin");
  18. //一个拷贝文件的webpack插件!
  19. const CopyWebpackPlugin = require("copy-webpack-plugin");
  20. //资源路径
  21. function assetsPath(_path) {
  22. return path.join(prodConfig.staticPath, _path);
  23. }
  24. //将webpack基本配置与生产环境配置合并!
  25. const prodConf = merge(baseConf, {
  26. //项目出口配置
  27. output: {
  28. //Build后所有文件存放的位置
  29. path: path.resolve(__dirname, "../public"),
  30. //html引用资源路径,可在此配置cdn引用地址!
  31. publicPath: prodConfig.publicPath,
  32. //文件名
  33. filename: assetsPath("js/[name].[chunkhash].js"),
  34. //用于打包require.ensure(代码分割)方法中引入的模块
  35. chunkFilename: assetsPath("js/[name].[chunkhash].js")
  36. },
  37. //生成sourceMaps(方便调试)
  38. devtool: prodConfig.devtoolType,
  39. module: {
  40. //处理模块的规则(可在此处使用不同的loader来处理模块!)
  41. rules: [
  42. //使用vue-loader处理以vue结尾的文件!
  43. {
  44. test: /\.vue$/,
  45. loader: "vue-loader",
  46. options: prodConfig.vueloaderConf
  47. },
  48. {
  49. test: /\.css$/,
  50. use: ExtractTextPlugin.extract({
  51. use: ["css-loader", "postcss-loader"],
  52. fallback: "vue-style-loader"
  53. })
  54. },
  55. {
  56. test: /\.less$/,
  57. use: ExtractTextPlugin.extract({
  58. use: ["css-loader", "less-loader", "postcss-loader"],
  59. fallback: "vue-style-loader"
  60. })
  61. }
  62. ]
  63. },
  64. plugins: [
  65. //每个chunk头部添加hey,xc-cli!
  66. new webpack.BannerPlugin("hey,xc-cli"),
  67. //压缩js
  68. new webpack.optimize.UglifyJsPlugin({
  69. parallel: true,
  70. compress: {
  71. warnings: false
  72. }
  73. }),
  74. //分离入口引用的css,不内嵌到js bundle中!
  75. new ExtractTextPlugin({
  76. filename: assetsPath("css/[name].[contenthash].css"),
  77. allChunks: false
  78. }),
  79. //压缩css
  80. new OptimizeCSSPlugin(),
  81. //根据模块相对路径生成四位数hash值作为模块id
  82. new webpack.HashedModuleIdsPlugin(),
  83. //作用域提升,提升代码在浏览器执行速度
  84. new webpack.optimize.ModuleConcatenationPlugin(),
  85. //抽离公共模块,合成一个chunk,在最开始加载一次,便缓存使用,用于提升速度!
  86. // 1. 第三方库chunk
  87. new webpack.optimize.CommonsChunkPlugin({
  88. name: "vendor",
  89. minChunks: function(module) {
  90. //在node_modules的js文件!
  91. return (
  92. module.resource &&
  93. /\.js$/.test(module.resource) &&
  94. module.resource.indexOf(path.join(__dirname, "../node_modules")) === 0
  95. );
  96. }
  97. }),
  98. // 2. 缓存chunk
  99. new webpack.optimize.CommonsChunkPlugin({
  100. name: "manifest",
  101. minChunks: Infinity
  102. }),
  103. // 3.异步 公共chunk
  104. new webpack.optimize.CommonsChunkPlugin({
  105. name: "app",
  106. children: true,
  107. // (选择所有被选 chunks 的子 chunks)
  108. async: true,
  109. // (创建一个异步 公共chunk)
  110. minChunks: 3
  111. // (在提取之前需要至少三个子 chunk 共享这个模块)
  112. }),
  113. //将整个文件复制到构建输出指定目录下
  114. new CopyWebpackPlugin([
  115. {
  116. from: path.resolve(__dirname, "../static"),
  117. to: prodConfig.staticPath,
  118. ignore: [".*"]
  119. }
  120. ]),
  121. //生成html
  122. new HtmlWebpackPlugin({
  123. filename: path.resolve(__dirname, "../public/index.html"),
  124. template: "index.html",
  125. favicon: path.resolve(__dirname, "../favicon.ico"),
  126. //js资源插入位置,true表示插入到body元素底部
  127. inject: true,
  128. //压缩配置
  129. minify: {
  130. //删除Html注释
  131. removeComments: true,
  132. //去除空格
  133. collapseWhitespace: true,
  134. //去除属性引号
  135. removeAttributeQuotes: true
  136. },
  137. //根据依赖引入chunk
  138. chunksSortMode: "dependency"
  139. })
  140. ]
  141. });
  142. module.exports = prodConf;

10. 创建 build/build.js

10.1 此文件是项目打包服务,用来构建一个全量压缩包
10.2

  1. "use strict";
  2. //node for loading
  3. const ora = require("ora");
  4. // rm-rf for node
  5. const rm = require("rimraf");
  6. //console for node
  7. const chalk = require("chalk");
  8. //path for node
  9. const path = require("path");
  10. //webpack
  11. const webpack = require("webpack");
  12. //webpack production setting
  13. const config = require("./webpack.prod.conf");
  14. //指定删除的文件
  15. const rmFile = path.resolve(__dirname, "../public/static");
  16. //build start loading
  17. const spinner = ora("building for production...");
  18. spinner.start();
  19. //构建全量压缩包!
  20. rm(rmFile, function(err) {
  21. if (err) throw err;
  22. webpack(config, function(err, stats) {
  23. spinner.stop();
  24. if (err) throw err;
  25. process.stdout.write(
  26. stats.toString({
  27. colors: true,
  28. modules: false,
  29. children: false,
  30. chunks: false,
  31. chunkModules: false
  32. }) + "\n\n"
  33. );
  34. if (stats.hasErrors()) {
  35. console.log(chalk.red(" Build failed with errors.\n"));
  36. process.exit(1);
  37. }
  38. console.log(chalk.cyan(" Build complete.\n"));
  39. console.log(
  40. chalk.yellow(
  41. " Tip: built files are meant to be served over an HTTP server.\n" +
  42. " Opening index.html over file:// won't work.\n"
  43. )
  44. );
  45. });
  46. });

10.3 创建好以上文件 我们就可以通过npm run build来打包我们的项目文件并部署上线啦。

11.大功告成!

通过以上步骤,一个spa版的vue脚手架就大功告成啦!

如果对一些细节不懂的可以留言或者上我的github查看

https://github.com/webfansplz...

最后还是那句话,如果有帮助到你,请给我star支持哈!

原文地址:https://segmentfault.com/a/1190000012736387

教你用webpack搭一个vue脚手架[超详细讲解和注释!]的更多相关文章

  1. 教你用webpack搭一个vue脚手架[超详细讲解和注释!](转载)

    1.适用人群 1.对webpack知识有一定了解但不熟悉的同学. 2.女同学!!!(233333....) 2.目的 在自己对webpack有进一步了解的同时,也希望能帮到一些刚接触webpack的同 ...

  2. 手把手教你启用Win10的Linux子系统(超详细)

    原文:手把手教你启用Win10的Linux子系统(超详细) 版权声明:转载请保留出处,谢谢! https://blog.csdn.net/zhangdongren/article/details/82 ...

  3. webpack从0到1超详细超基础学习教程

    概念 自己是一个一听到webpack就头大,看着一堆不知道那是什么玩意的东西总觉得自己做好前端就行了,但是在使用vue-cli的时候总觉得要改其中的一些东西进行项目初始化的时候能够更好使用!所以想要根 ...

  4. 安装Vue和创建一个Vue脚手架项目

    首先 安装node.js,安装成功可以在控制台输入[node --version ]查看node的版本,因为安装了node会自带npm所以我们可以用 [npm --version]查到npm版本  如 ...

  5. 如何搭一个vue项目

    1.yarn global add @vue/cli (vue/cli是webpack的二次开发)   2.vue create 自定义项目名称   3.选择Manually select featu ...

  6. 用webpack发布一个vue插件包

    创建库 本来以为很简单,结果配置了webpack之后,运行build就报错了,似乎不认识es6语法,于是先后安装了几个包: @babel/core @babel/preset-env babel-lo ...

  7. vue企业项目搭建过程(vue-cli脚手架超详细教程 傻瓜-入门)

    vue作为现在主流的前端框架,有必要学习一下. vue的官方文档还是不错的,开源中文,一个爽字形容. 如果不是实际开发需要vue-cli构建项目,那么可以在加一个爽. 然而要构建的时候发现官方文档还是 ...

  8. vue cli3超详细创建多页面配置

    1.首先按照vue cli3 给的入门文档下载个vue cli3 如果之前下载了vue cli2的要先卸载之前的 2.检查安装是否成功 3.ok,现在环境搭建好了,新建项目 vue create he ...

  9. Vue项目开发,nprogress进度条加载之超详细讲解及实战案例

    Nprogress的默认进度条很细,它的设计灵感主要来源于 谷歌,YouTube 他的安装方式也很简单,你可以有两种使用方式: 直接引入js和css文件 使用npm安装的的方式 直接引入: Npm安装 ...

随机推荐

  1. HDU 6149 Valley Numer II (状压DP 易错题)

    题目大意:给你一个无向连通图(n<=30),点分为高点和低点,高点数量<=15,如果两个高点和低点都直接连边,那么我们称这三个点形成一个valley,每个点最多作为一个valley的组成部 ...

  2. 流媒体应用程序Mobdro或存在安全隐患

    Mobdro是一款流媒体应用程序,可以安装在任何Android设备上,包括手机,平板电脑,亚马逊的Fire TV Stick和Google的Chromecast.它现在已经流行了一段时间,特别是在围绕 ...

  3. oracle数据库服务介绍

    共有7个服务,这七个服务的含义分别为: 1. Oracle ORCL VSS Writer Service:Oracle卷映射拷贝写入服务,VSS(Volume Shadow Copy Service ...

  4. tp volist需要便利两个数组时的处理办法

    你需要便利两个数组,并且需要使用key 和value的试的时候,volist是否先得有些捉鸡? 我们可以便利其中一个数组,而另一个利用数组的指针来操作 next($arr) 将数组指针下移 key($ ...

  5. Maven导入ojdbc14.jar和ojdbc6.jar

    Maven导入ojdbc14.jar和ojdbc6.jar 学习了:http://blog.csdn.net/johon_medison/article/details/51689690 在 ‘运行’ ...

  6. xftp和xshell的使用

    Xftp和Xshell配合使用部署环境. (linux系统) Xftp为可视化工具.主要用来复制文件. xshell则通过输入命令来对server进行操作,如启动服务等等. 一.  Xftp的连接 新 ...

  7. HDU 1040.As Easy As A+B【排序】【如题(水!水!水!)】【8月24】

    As Easy As A+B Problem Description These days, I am thinking about a question, how can I get a probl ...

  8. ubuntu16.04安装破解pycharm

    分两步,首先安装jdk,然后安装并破解pycharm 一.安装jdk 参考:http://blog.csdn.net/yebhweb/article/details/55098189 下载jdk1.8 ...

  9. 山东理工oj--1912--IP地址(水题)

     IP地址 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 2011年2月3日,国际互联网名称与数字地址分配机构(ICANN) ...

  10. caffe中LetNet-5卷积神经网络模型文件lenet.prototxt理解

    caffe在 .\examples\mnist文件夹下有一个 lenet.prototxt文件,这个文件定义了一个广义的LetNet-5模型,对这个模型文件逐段分解一下. name: "Le ...