# vue-webpack **Repository Path**: ljagps/vue-webpack ## Basic Information - **Project Name**: vue-webpack - **Description**: webpack从零开始搭建Vue项目,包含:vue-router/vuex/scss支持/热加载等 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-07-15 - **Last Updated**: 2021-07-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # webpack从零开始搭建Vue项目 *包含:vue-router/vuex/scss支持/热加载等,从创建文件夹开始,内容稍微有点长,通过这个配置可以对webpack有一个基础的了解* ### 一、 项目初始化 *在存放项目的地方打开命令行窗口,依次执行以下命令:* 1. `mkdir vue-demo`创建文件夹 2. `cd vue-demo`进入文件夹 3. `npm init -y`初始化项目 ### 二、 webpack初始化 1. 安装webpack,执行命令`npm install webpack webpack-cli -D` 2. 修改package.json,添加启动命令 ``` // vue-demo/package.json { ... "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "dev": "webpack --mode development", "build": "webpack --mode production" }, ... } ``` 3. vue-demo下创建src文件夹,用于存放vue项目主要文件(vue-cli脚手架也是这么干的,咱也这么干,尽量接近vue-cli脚手架) 4. vue-demo/src下创建main.js,作为项目的入口文件 5. vue-demo下创建webpack.config.js文件,用于配置webpack ``` // vue-demo/webpack.config.js const path = require('path'); module.exports = { entry: './src/main.js', // 入口文件 output: { // 输出 filename: 'main.js', path: path.resolve(__dirname, 'dist') } }; ``` 6. 此时已经可以执行打包了,打包命令`npm run build`,dist为打包输出的文件 ### 三、 创建HTML模板 *html模板可以让我们加入一些自定义或第三方的工具* 1. vue-demo下创建index.html ``` // vue-demo/index.html vue&&webpack

Hello World

``` 2. 使用html-webpack-plugin创建模板,执行`npm install html-webpack-plugin -D` 3. 修改webpack.config.js ``` // vue-demo/webpack.config.js const path = require('path'); module.exports = { entry: './src/main.js', // 入口文件 output: { // 输出 filename: 'main.js', path: path.resolve(__dirname, 'dist') }, plugins: [ new HtmlWebpackPlugin({ template: './index.html', minify: { collapseWhitespace: true, //折叠空白区域 removeComments: true, //删除注释 hash: true, //是否需要对src引的文件后面加上Hash,使用时需要区分开发环境和生产环境 chunks: [], //允许添加一些额外的文件 chunksSortMode: 'manual' //chunks的文件顺序注入 } }), ] }; ``` 3. 执行打包命令`npm run build`,dist文件夹下生成了index.html,运行即可看到Hello World ### 四、 编译css *开发时,css都是单独的文件,我们姑且这样做* 1. vue-demo/src下创建common.css,将index.html中的style移植过来,为了区分,改一下颜色 ``` // vue-demo/src/common.css body{ background-color: #fff; color: red; } // vue-demo/index.html vue&&webpack

Hello World

``` 2. 修改main.js,引人css ``` // vue-demo/src/main.js import './common.css' ``` *此时执行打包命令,会报错,这是因为webpack只能处理js和json代码,处理其他代码则需要借助loader* 4. 安装处理css需要的loader,执行`npm install css-loader style-loader -D` 5. 配置loader,修改webpack.config.js ``` // vue-demo/webpack.config.js 新增 module: { rules: [{ test: /\.css$/, use: [ 'style-loader', 'css-loader' ] }] } ``` *注意加载顺序,此处style-loader必须在css-loader之前,否则会报错,你可以试一下*’ 6. 执行打包命令,运行打包后的html文件,可以看到白色背景红色字体,即为成功 ### 五、 热更新 *提醒:修改各种配置文件或者安装插件时,先把项目停止,以免发生不可预期的错误* 1. 在集成vue之前,先实现热更新的功能,免得每次都要打包查看结果,安装插件`npm install webpack-dev-server -D` 2. 修改webpack.config.js ``` // vue-demo/webpack.config.js 新增 devServer: { contentBase: path.join(__dirname, 'dist'), // 服务器资源的根目录,不写的话,默认为bundle.js hot: true, //启用热加载 host: 'localhost', port: 5000, //端口号 compress: true, // 服务器资源采用gzip压缩 open: true, // 服务器启动后打开默认浏览器 historyApiFallback: true, // 解决history模式刷新404 } ``` *提醒:historyApiFallback是解决本地history刷新页面404的配置,线上是使用nginx配置解决* 3. 修改package.json文件 ``` // vue-demo/package.json 修改 "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "dev": "webpack serve --mode development", "build": "webpack --mode production" } ``` *提醒:以前的写法是"dev": "webpack-dev-serve --mode development",现在已变更为"dev": "webpack serve --mode development",这个耽误了我不少查找时间,这里做个记录* 4. 执行`npm run dev`,不出意外,项目会自动打开了。(是不是跟vue脚手架有一点像了) ### 六、 集成Vue *上面的操作跟vue没有任何关系,现在请主角登场* 1. 安装vue,执行`npm install vue` 2. 修改main.js ``` // vue-demo/src/main.js 看一下控制台是否打印成功 import Vue from 'vue' import './common.css' console.log(Vue); ``` 3. 创建App.vue入口文件(vue-cli创建的项目是不是也有一个这个东西?这里还原他) ``` // vue-demo/src/App.vue 将main.js里引入css的代码去掉,在这里引入,保持main.js的整洁 ``` 3. 创建vue实例 ``` // vue-demo/src/main.js 看一下控制台是否打印成功 import Vue from 'vue' import './common.css' console.log(Vue); new Vue({ render: (h) => { return h(App) } }).$mount("#app") ``` 4. 重新启动项目,出乎意料的是报错了,“你好,世界”也没有显示出来 *报错如下:Uncaught Error: Module parse failed: Unexpected token (1:0) You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file*
*大致意思是我们确实处理vue的loader,当然了,前面说过,webpack默认只认识js和json,所有这里我们要给他赋能* 5. 安装vue-loader,修改配置,执行`npm install vue-loader vue-template-compiler -D`,为什么是两个,具体可以上官网查看 ``` // vue-demo/webpack.config.js 修改 const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const { VueLoaderPlugin } = require('vue-loader'); module.exports = { entry: './src/main.js', // 入口文件 output: { // 输出 filename: 'main.js', path: path.resolve(__dirname, 'dist') }, plugins: [ new HtmlWebpackPlugin({ template: './index.html', minify: { collapseWhitespace: true, //折叠空白区域 removeComments: true, //删除注释 hash: true, //是否需要对src引的文件后面加上Hash,使用时需要区分开发环境和生产环境 chunks: [], //允许添加一些额外的文件 chunksSortMode: 'manual' //chunks的文件顺序注入 } }), new VueLoaderPlugin() ], module: { rules: [{ test: /\.css/, use: [ 'style-loader', 'css-loader' ] },{ test: /\.vue$/, use: [ 'vue-loader' ] }] }, devServer: { contentBase: path.join(__dirname, 'dist'), // 服务器资源的根目录,不写的话,默认为bundle.js hot: true, //启用热加载 host: 'localhost', port: 5000, //端口号 compress: true, // 服务器资源采用gzip压缩 open: true, // 服务器启动后打开默认浏览器 historyApiFallback: true, // 解决history模式刷新404 } }; ``` 6. 运行项目`npm run dev`,红色的“你好,世界”出来了吧,看到有一个英文闪一下,删掉idnex.html #ppp 里的内容 ### 七、 集成scss *这个跟vue-cli项目一样的集成方式,这里再来一遍* 1. 安装,执行`npm install node-sass sass-loader -D`,修改webpack.config.js ``` // vue-demo/webpack.config.js module新增 { test: /\.scss$/, use: [ 'style-loader', 'css-loader', 'sass-loader' ] } ``` *至此,此项目的webpack配置文件我们配置完了,如需其他配置可上官网查看* 2. 将vue-demo/src/common.css改为common.scss,App.vue引用也改成@import url("./common.scss") ``` // vue-demo/src/App.vue ``` 3. 启动项目,不报错且能看到红色字体,则说明scss集成成功 ### 八、 集成vue-router 1. 安装vue-router,`npm install vue-router` 2. vue-demo/src下创建pages目录,并在pages下创建4个vue页面,分别命名为pageA、pageB、pageC、pageD ``` // vue-demo/src/pages/pageA 其他页面跟这个一样,只是h1里的内容不一样 ``` 3. vue-demo/src下创建route文件夹,并在route下创建index.js,作为路由配置文件 ``` // vue-demo/src/route/index.js 其中配置了路由及子路由 import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) export default new VueRouter({ mode: 'history', routes: [ { path: '/', redirect: { name: 'pageA' }, }, { name: 'pageA', path: '/pageA', component: () => import('../pages/pageA.vue'), children: [ { name: 'pageB', path: 'pageB', component: () => import('../pages/pageB.vue') }, { name: 'pageC', path: 'pageC', component: () => import('../pages/pageC.vue') } ] }, { name: 'pageD', path: '/pageD', component: () => import('../pages/pageD.vue') } ] }) ``` 4. main.js注入vue,并启动项目,此时浏览器为[http://localhost:5000/pageA](http://localhost:5000/pageA),恭喜,路由集成成功 ``` // vue-demo/src/main.js import Vue from 'vue' import App from './App.vue' import router from './router' new Vue({ router, render: (h) => { return h(App) } }).$mount("#app") ``` 5. 接下来验证一下子路由,修改pageA ``` // vue-demo/src/pages/pageA ``` *点击子路由按钮,分别跳转到不同路由,页面也有变化,恭喜,子路由也没有问题* ### 九、 集成vuex *为了验证vuex,在vue-demo/src下新建一个components目录,熟悉vue的知道接下来要干嘛了,没错,创建公共组件* 1. vue-demo/src/components下创建Footer.vue ``` // vue-demo/src/components/Footer.vue ``` 2. 在App.vue引用组件 ``` ``` *此时已经可以切换pageA、pageB、pageC、pageD四个路由了,接下来集成vuex* 3. 安装vuex,`npm isntall vuex` 4. vue-demo/src下新建store文件夹,并在store下新建index.js作为vuex配置 ``` vue-demo/src/store/index.js import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({ state: { count: 0 }, mutations: { increment (state) { state.count++ } } }) ``` *这里store我们使用官方案例,做一个计数器功能* 5. main.js注入vuex ``` vue-demo/src/main.js import Vue from 'vue' import App from './App.vue' import router from './route' import store from './store' new Vue({ router, store, render: (h) => { return h(App) } }).$mount("#app") ``` 6. 验证vuex,在pageA、pageD中分别加入验证的代码 ``` //pageA // pageD ``` *此时在apgeA和pageD中点击按钮,无论切换到另外哪个路由,可以看到计数器的值已经实现共享了,至此vuex集成完毕* *一个简单vue项目诞生了,完毕!!!*