不使用vue脚手架 搭建项目(webpack简单配置)

前言

  今天介绍一篇关于工程搭建的文章。主要介绍不用cli脚手架搭建一套前端工程,因为每个公司不是用脚手架工具安装一下就能进行开发了,很多时候都是对工程有一定的定制需求,你没有深入的去了解cli脚手架的话,可能会很吃力,所以这块还是需要有一定的深入了解的,内容也不是太复杂,但是你需要掌握一些vue、webpack、nodejs的简单的基本概念和认识,也挺适合初级者阅读,我们学前端的小伙伴其实都知道,前端的工程搭建不像后端,后端有一套非常健全的ide开发工具,我们不管做什么样子的项目,企业级应用的话,用j2ee;web工程用javaweb等等一些定制化的工程,都有一套。对于开发这来说,其实注重的是服务器的搭建,接口的定制,开发的调试,业务的实现。但对于前端来说,我们其实并没有太多这样的ide工具(忽略webstorm,因为没怎么使用过,才肤浅地这么认为),但是也不排除未来会出现,我们还是一起期待吧。所以在这些工具出来之前,我们前端的同学还是得学会自己来搭一套前端工程。

  接下来我来告诉大家为什么要搭建这么一个工程。可能很多小伙伴都有类似的经历,没有经历过得朋友不用担心,未来你能理解的,也会遇到,那有过一些开发项目经验的同学应该会发现身边的同事大概有两种发展方向。一种是做业务开发的,一种是偏向于技术框架的。前者更注重业务的实现,我们知道一个项目百分之八十的时间都是用在实现业务逻辑方面,做多了我们其实会发现,这种开发的工作对我们的挑战其实并不是太大,每个公司的业务逻辑都不一样,复杂度也并不是太高,所以技术提升这一方面,其实是有一定限制的。但是存在即合理,注重这块开发的同学其实可以往管理的角度来发展,也不失为一种方向。但是对技术有一定要求的同学来说,我觉得更需要往后者的方向靠拢。前面也说了业务代码很多都是拷贝粘贴,对基本功有一定的要求,如果想从技术方向去提升自己的价值,我个人建议还是往前端工程化的方向去发展。从工程的搭建,模块化的设计,api的定制,请求的封装,本地开发模式的建立,工程上线的部署等等,这些都需要非常的熟悉。这样一来不管你到哪家公司,做什么样的项目,有一套这样的技术储备作为解决方案,你会很吃香。当然如果后期向往管理的方向发展,也是可以的,这个时候的你对技术的掌握能力,能帮助你更能准确地评估出开发的工作量,掌控项目的开发周期,比前者更准确地估算项目人力成本的预算以及开发过程中遇到的技术难题和风险点,这是非常实用的,内容较多,小白们建议某个周末早上读完。

  所以仁者见仁,每个人有每个人的发展方向,不一定按照这样的模式去丰富自己,这只是依照个人的一些实际经验做出来的总结。好了闲话不扯太多了,我们进入正式进入主题吧。

配置开发时的前端工程(vue-loader+webpack)

okay,我们先来配置我们的项目,首先我们新建一个文件夹,用vscode打开,这里开发工具的选择依照自己的喜好来。

  我们通过快捷键 ‘ctrl + ·’,也就是esc下面的小点,打开终端,我们先来用 npm init 来初始化项目,因为这里是演示demo,我全部使用的默认,大家实验的时候直接敲回车就行了。

 
  1. Microsoft Windows [版本 6.1.7601]

  2. 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

  3.  
  4. E:\vue实战\vue_web>npm init

  5. This utility will walk you through creating a package.json file.

  6. It only covers the most common items, and tries to guess sensible defaults.

  7.  
  8. See `npm help json` for definitive documentation on these fields

  9. and exactly what they do.

  10.  
  11. Use `npm install ` afterwards to install a package and

  12. save it as a dependency in the package.json file.

  13.  
  14. Press ^C at any time to quit.

  15. package name: (vue_web)

  16. version: (1.0.0)

  17. description:

  18. entry point: (index.js)

  19. test command:

  20. git repository:

  21. keywords:

  22. author:

  23. license: (ISC)

  24. About to write to E:\vue实战\vue_web\package.json:

  25.  
  26. {

  27. "name": "vue_web",

  28. "version": "1.0.0",

  29. "description": "",

  30. "main": "index.js",

  31. "scripts": {

  32. "test": "echo \"Error: no test specified\" && exit 1"

  33. },

  34. "author": "",

  35. "license": "ISC"

  36. }

  37.  
  38.  
  39. Is this OK? (yes) yes

  40.  
  41. E:\vue实战\vue_web>

这个时候细心的同学会发发现我们目录下面多一个叫package.json的文件,这个文件就是我们项目的配置文件。

好,我们先来安装一下包,因为我们用到了vue以及webpack,所以我们需要将这两个依赖包安装一下,除了这些呢,还有段落标题中的vue-loader,这个就是为了用webpack加载.vue文件,并将它编译成浏览器能认识的js文件,我们先来执行这样的指令,注:我们这里是demo,所以这里就不区分是否是dev-dependency了。(详情可以参考https://www.cnblogs.com/ayseeing/p/4128612.html)

npm i webpack vue vue-loader

 

 
  1. E:\vue实战\vue_web>npm i webpack vue vue-loader

  2. npm notice created a lockfile as package-lock.json. You should commit this file.

  3. npm WARN [email protected] requires a peer of css-loader@* but none is installed. You must install peer dependencies yourself.

  4. npm WARN [email protected] No description

  5. npm WARN [email protected] No repository field.

  6. npm WARN optional SKIPPING OPTIONAL DEPENDENCY: [email protected] (node_modules\fsevents):

  7. npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})

  8.  
  9. + [email protected]

  10. + [email protected]

  11. + [email protected]

  12. added 350 packages from 286 contributors and audited 4195 packages in 153.368s

  13. found 0 vulnerabilities

  14.  
  15.  
  16. E:\vue实战\vue_web>

安装完成之后会出现一些waring,大家可以可看出来这个warning其实就是告诉我们在安装vue-loader的同事必须要安装css-loader,这里我们想它继续安装完成就可以了。

npm WARN [email protected] No description
npm WARN [email protected] No repository field.

这两个是我们项目初始化的时候由于都是回车回车,缺少一些描述,无需关心。

npm WARN optional SKIPPING OPTIONAL 
npm WARN notsup SKIPPING OPTIONAL 

这两个是告诉我们项目初始化时候哪些是可选择安装的,哪些是可以不安装的,这里我们也无需,继续执行

npm i css-loader
 
  1. E:\vue实战\vue_web>npm i css-loader

  2. npm WARN [email protected] No description

  3. npm WARN [email protected] No repository field.

  4. npm WARN optional SKIPPING OPTIONAL DEPENDENCY: [email protected] (node_modules\fsevents):

  5. npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})

  6.  
  7. + [email protected]

  8. added 18 packages from 10 contributors and audited 4301 packages in 34.711s

  9. found 0 vulnerabilities

  10.  
  11.  
  12. E:\vue实战\vue_web>

好,到这里,我们项目的大概的初始化工作就完成了。接下来我们就基于这样的目录,填充一下更丰富的细节。

我们在工程目录下新建一个src文件夹用来存放源文件,并新建一个app.vue的文件:

app.vue文件代码:

 
  1.  
  2.  
  3.  
  4.  

大家都知道,浏览器其实只能够识别一些简单的文件,像js,css,html,img,font,但是如何让浏览器识别vue文件呢?

webpack配置

1. 输入输出

到这其实我们应该有一些认知了,webpack其实就是一个帮我们打包的工具。接下来我们在工程目录下新建一个webpack.config.js文件。

接下来我们在新建的webpack.config.js里面做文章。我们知道webpack是用来打包的工具,我们工程总得有个入口文件,让浏览器去访问,让webpack去打包并输出。所以这个时候我们的事情来了,配置webpack的入口和出口。

在src目录下新建一个index.js的文件作文工程的入口文件。

然后我们在index.js里面写一些内容,代码中我都做了注释,大家应该一眼就能看懂

index.js:

 
  1. //这是工程的入口文件

  2. import Vue from 'vue';

  3. import App from './app.vue';

  4.  
  5. const root = document.createElement('div')

  6. document.body.appendChild(root)

  7.  
  8. //mount就是讲我们的App挂载到root这样一个根节点中去

  9. new Vue({

  10. render: (h) => h(App)

  11. }).$mount(root)

我们这时候发现,浏览器要想运行这段代码,那是不可能的,因为浏览器不认识vue,更不认识new Vue,所以webpack要登场了。我们在webpack.config.js里配上entry入口和out出口,表示webpack文件会将将entry路径下的文件,打包到out的路径,

具体如下:

webpack.config.js:

 
  1. const path = require("path");//nodejs里面的基本包,用来处理路径

  2.  
  3. //__dirname表示文件相对于工程的路径

  4. module.exports ={

  5. entry: path.join(__dirname, 'src/index.js'),

  6. output: {

  7. filename: 'bundle.js',

  8. path: path.join(__dirname, 'dist')

  9. }

  10. }

这里代码就不多说了,都有注释,这里卖个关子,也是经常会发生的场景,就是这里的join和resolve这两个函数的用法和区别,最好去官网看一下说明,直通车https://webpack.js.org/,英文不好的同学可以去中文官网学习都是可以的,没有关系的,看不懂的时候我也会去看中文文档。

好上面的代码就是做了这样一件事,将src下的index.js文件以js的形式打包到dist目录下的bundle.js中去。大家有疑问了,这两个目录我还没有新建呢!没有关系out属性中定义的路径如果没有的话,webpack会自动创建的,我们需要做的是就是新建src目录并添加index.js文件。那这个动作我们已经新建完成了,不记得的同学返回文章内容再看看。

这时候我们打开package.json文件添加一句:

"build": "webpack --config webpack.config.js"

很多有经验的同学应该都用过npm run build 这句话,这里添加的这个指令,就是我们在终端输入npm run build之后webpack帮我们干的一些事情,那我们这里呢这句的意思就是webpack去帮我们执行我们新建的webpack.config.js文件。注意这里我们使用webpack来执行指令,同样也可以在终端执行这段指令,但是我们要清楚在终端直接执行build后面的指令会出现一个问题,如我们在终端执行该指令,意味着使用的是全局的webpack,但是我们写在package.json文件下的话,意味着执行工程下面的局部wepackage,全局和局部可能会版本不一样,所以为了避免不必要的麻烦,我们在package.json文件下执行,也就是说使用的局部的webpack来打包。

好到这里,我们编译打包输入输出的相关配置已经完成,我们先执行一下:npm run build。可能有经验的小伙伴会发现还有一些配置没有完成,没关系,我们一步步来,带着错误把问题一个一个解决。

 
  1.  
  2. E:\vue实战\vue_web>npm run build

  3.  
  4. > [email protected] build E:\vue实战\vue_web

  5. > webpack --config webpack.config.js

  6.  
  7. One CLI for webpack must be installed. These are recommended choices, delivered as separate packages:

  8. - webpack-cli (https://github.com/webpack/webpack-cli)

  9. The original webpack full-featured CLI.

  10. We will use "npm" to install the CLI via "npm install -D".

  11. Do you want to install 'webpack-cli' (yes/no): yes

由于我使用的是webpack4,所以这里必须要安装一下cli。这里有人就问了,哎呀不是不用cli的嘛,怎么要安装这个包。如果你有这样的想法,证明你有自己用过cli搭建过vue项目框架的一些经验。我们知道用cli脚手架搭建出来的项目结构应该是这样的:

该图来源于网络,我们这里安装这个cli包是因为webpack4之后强制要求安装的,但是我们并没有通过该工具来初始化整个工程,所以建出来的目录也是不一样的,所以大家仔细想想就明白了。好了,接下来直接yes就可以,安装完成之后,再执行一下 npm run build,有些不需要再执行,但没有关系,反正都会报错:

 
  1. E:\vue实战\vue_web>npm run build

  2.  
  3. > [email protected] build E:\vue实战\vue_web

  4. > webpack --config webpack.config.js

  5.  
  6. Hash: 057884840cecb3060636

  7. Version: webpack 4.28.4

  8. Time: 5481ms

  9. Built at: 2019-01-14 13:31:11

  10. 1 asset

  11. Entrypoint main = bundle.js

  12. [0] (webpack)/buildin/global.js 472 bytes {0} [built]

  13. [1] ./src/app.vue 184 bytes {0} [built] [failed] [1 error]

  14. [3] ./src/index.js 233 bytes {0} [built]

  15. + 4 hidden modules

  16.  
  17. WARNING in configuration

  18. The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults for each environment.

  19. You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/concepts/mode/

  20.  
  21. ERROR in ./src/app.vue 1:0

  22. Module parse failed: Unexpected token (1:0)

  23. You may need an appropriate loader to handle this file type.

  24. >