# webpack **Repository Path**: Gnius/webpack ## Basic Information - **Project Name**: webpack - **Description**: 2020年9月12日 下午 在家跟着黑马老师 的课 BV1ih411R7J4进行学习的记录 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-09-13 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 一 创建列表隔行变色项目 #### 1、新建项目空白目录,并运行 npm init -y 命令,初始化包管理配置文件 package.json #### 2、新建 src 源代码目录 #### 3、新建 src->index.html 首页 #### 4、初始化首页基本结构 #### 5、运行 npm install jquery -S 命令,安装 jQuery #### 6、通过模块化形式,实现列表隔行变色效果 # ul>li{这是快捷生成列表的方法}\*9 ## 二 在项目中安装和配置 webpack #### 1.运行 npm install webpack webpack-cli -D 命令,安装 webpack 相关的包 #### 2.在项目根目录中,创建名为 webpack.config.js 的 webpack 配置文件 #### 3.在 webpack 的配置文件中,初始化如下基本配置 ``` module.exports = { mode: 'development' // mode指定构建模式 } ``` ###### 开发模式转换的代码不会压缩、混淆,转换速度快; ###### 产品发布模式转换的代码会被压缩,转换时间相对较长(上线时用)。 #### 4.在 package.json 配置文件中的 scripts 节点下,新增 dev 脚本如下: ``` "scripts": { "dev": "webpack" // script节点下的脚本,可以通过npm run 执行 } ``` #### 5.在终端中运行 npm run dev 命令,启动 webpack 进行项目打包。 #### 这是我首次使用 webpack 配合 jquery 插件做的隔行变色打包后的效果图 ![avatar](./img/效果图001.png) ![avatar](./img/效果图002.png) ## 三 配置打包的入口与出口 #### webpack 的 4.x 版本中默认约定 - 打包的入口文件为 src-> index.js - 打包的输出文件为 dist-> main.js 如果要修改打包的入口与出口,可以在 webpack.config.js 中新增如下配置信息: ``` const path = require('path') //导入 node.js中专门操作路径的模块 module.exports = { entry: path.join(__dirname,'./src/index.js'), //打包入口文件的路径 output: { path: path.join(__dirname,'./dist'), //输出文件的存放路径 filename: 'bundle.js' //输出文件的名称 } } ``` ## 四 配置 webpack 的自动打包功能 #### 避免每次写完后,需要的手动 npm run dev 执行配置的 webpack 编译打包 #### 1、运行 npm install webpack-dev-server -D 命令,安装支持项目自动打包的工具 #### 2、修改 package.json -> scripts 中的 dev 命令如下: ``` "scripts": { "dev": "webpack-dev-server" //script 节点下的脚本,可以通过 npm run 执行 } ``` #### 3、将 src->index.html 中,script 脚本的引用路径,修改为 "/buldle.js" #### 4、运行 npm run dev 命令,重新进行打包 #### 5、在浏览器中访问 http://localhost:8080 地址,查看自动打包的效果如下: ![avator](./img/效果图003.png) 注意: - ###### webpack-dev-server 会启动一个实时打包的 http 服务器,监听代码的实时变化,保存代码后并自动打包 - ###### webpack-dev-server 打包生成的输出文件,默认放到了项目根目录中,而且是虚拟的,看不见的隐藏文件 ## 五 配置 html-webpack-plugin 会在打包完后dist目录自动生成index.html   并把打包生成的bundle.js自动引入在这个文件中 #### 1、安装: 运行 npm i html-webpack-plugin -D 命令,安装生成预览页面的插件 #### 2、使用:修改 webpack.config.js 文件头部区域,添加如下配置信息: ``` // 导入生成预览页面的插件,得到一个构造函数 const HtmlWebpackPlugin = require('html-webpack-plugin') //创建插件的实例对象 const htmlPlugin = new HtmlWebpackPlugin({ template: './src/index.html', //指定要用到的模板文件 //指定生成文件的名称,该文件存在于内存中,在目录中不显示 filename: 'index.html' }) ``` #### 3、修改 webpack.config.js 文件中向外暴露的配置对象,新增如下配置节点: ``` module.exports = { // plugins 数组是 webpack打包期间会用到的一些插件列表 plugins: [ htmlPlugin ] } ``` ![avator](./img/效果图004.png) ## 六 配置自动打包相关的参数 ``` "script": { "dev": "webpack-dev-server --open --host 127.0.0.1 --port 8888" } ``` #### 在 package.json 中修改上面的代码 配置--open 是自动打开浏览器 主机和端口的配置,效果如下: 注意:修改完配置文件,需要手动重启服务 npm run dev ![avator](./img/效果图005.png) ## 七 webpack 中的加载器 ![avator](./img/效果图006.png) #### loader 用来协助 webpack 进行打包的 注意:webpack 默认只能打包处理 xx.js 的文件,如果不是该类型文件会去 webpack.conf.js 文件中寻找对应的 loader,若找不到就会报错。如下图所示:的.css 文件不能直接打包。 ![avator](./img/效果图007.png) #### 1.打包处理 css 文件 安装:运行 npm i style-loader css-loader -D 命令 配置:在 webpack.config.js 的 module->rules 数组中,添加 loader 规则如下: ``` // 所有第三方文件模块的匹配规则 module: { rules: [ { test: /\.css/, use: ['style-loader','css-loader'] } ] } ``` 使用: 在 src-index.js 文件中用 import "./css/xxx.less" 导入完成 运行 npm run dev 其中, test 表示要匹配的文件类型, use 表示对应要调用的 loader.运行效果如下 ![avator](./img/效果图008.png) 注意:这两个 loader 的顺序不能颠倒否则会报错。 注意:多个 loader 时的调用顺序是从后往前调用。 #### 2.打包处理 less 文件 安装: 运行 npm i less-loader less -D 命令 配置:在 webpack.config.js 的 module->rules 数组中,添加 less-loader 规则如下: ``` // 所有第三方文件模块的匹配规则 module: { rules: [ { test: /\.css/, use: ['style-loader','css-loader'] }, //上一步规则 { test: /\.less$/, use: ["style-loader", "css-loader", "less-loader"] } //当前规则 ] } ``` 使用: 在 src-index.js 文件中用 import "./css/xxx.less" 导入完成 运行 npm run dev ![avator](./img/效果图009.png) #### 3.打包处理 scss 文件 安装: 运行 npm i sass-loader node-sass -D 命令 配置: 在 webpack.config.js 的 module->rules 数组中,添加 loader 规则如下: ``` module: { rules: [ { test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] } ] // 说明 规则中使用test指定匹配的后缀名,用use指定需要调用哪些 loader // 该规则中 sass-loader 依赖于前两个 loader } ``` 注意: loader 是 sass-loader,但是 sass 文件的后缀名是 xxx.scss ##### 重启服务后以下是运行的结果: ![avator](./img/效果图010.png) #### 4.配置 postCSS 自动添加 css 的兼容前缀 ``` ::placeholder { color: red; } ``` 需求:解决下列两张图片的兼容问题。 **chrome** ![avator](./img/效果图011.png) **IE** ![avator](./img/效果图012.png) 安装: 运行 npm i postcss-loader autoprefixer -D 命令 配置:在项目根目录中创建 postcss 的配置文件 postcss.config.js,并初始化如下配置: ``` const autoprefixer = require('autoprefixer') module.exports = { plugins: [ autoprefixer ] //挂载插件 } ``` 然后在 webpack.config.js 的 module->rules 数组中,修改 css 的 loader 规则如下: ``` module: { rules: [ { test:/\.css$/, use:['style-loader', 'css-loader', 'postcss-loader'] } ] } ``` 重启服务 ,IE 显示效果如下,自动添加了厂商前缀 ![avator](./img/效果图013.png) #### 5. 打包样式表中的图片和字体文件 ##### 直接引入图片,打包后报错了。webpack 默认处理不了样式表里的路径,此时需要安装第三方的 loader 解决 安装: npm i url-loader file-loader -D 命令 在 webpack.config.js 的 module-> rules 数组中,添加 loader 规则如下: ``` module: { rules: [ { test: /\.jpg|png|gif|bmp|ttf|eot|svg|woff|woff2$/, use: "url-loader?limit=16940" } ] } // 其中ttf开始是字体文件,use中?后的是 loader的参数项 需要传参 // limit 用来指定图片的大小,单位是字节(byte),只有小于 limit 大小的图片,才会被转为 base64 图片 ``` ≥ limit 限制的图片打包效果如下图所示:(正常输出路径) ![avator](./img/效果图014.png) < limit 限制的图片打包效果如下图所示:(被转为 base64 编码) ![avator](./img/效果图015.png) #### 6. 打包处理 js 文件中的高级语法 安装:babel 转换器相关的 3 个包 npm i babel-loader @babel/core @babel/runtime -D 安装:babel 语法插件相关的 3 个包 npm i @babel/preset-env @babel/plugin-transform-runtime @babel/plugin-proposal-class-properties -D 在项目中,创建 babel 配置文件 babel.config.js 并初始化基本配置如下: ``` module.exports = { presets: [ '@babel/preset-env'], plugins: ['@babel/plugin-transform-runtime','@babel/plugin-proposal-class-properties'] } ``` 在 webpack.config.js 的 module-> rules 数组中,添加 loader 规则如下: ``` // exclude 为排除项,表示 babel-loader 不需要处理 node-modules中的 js 文件 { test: /\.js$/, use: 'babel-loader', exclude: /node_modules/ } ``` 输出结果如图所示: ![avator](./img/效果图016.png) 没有用 babel 之前浏览器是不能识别 ES6 中的 class 语法的,直接报错。 ![avator](./img/效果图018.png) ##### Vue 单文件组件的基本用法 1. 在项目的 src 目录下新建 components 目录,在该目录下再次新建 App.vue 文件。 2. 在项目的 src 目录下 index.js 中 用 import 引入 App.vue 组件。 3. 去浏览器刷新后,会发现报错。You may need an appropriate loader to handle this file type 提示需要一个加载器 ![avator](./img/效果图017.jpg) 提示: 默认只能处理 .js 文件 这里的 .vue 文件需要配置 loader。以下是解决方法: ## 八 webpack 中配置 vue 组件的加载器 安装: npm i vue-loader vue-template-compiler -D 命令 配置: 在 webpack.config.js 配置文件中,添加 vue-loader 的配置项如下: ``` const VueLoaderPlugin = require('vue-loader/lib/plugin') module: { rules [ // ...其他规则 { test: /\.vue$/, loader: 'vue-loader' } ] }, plugins: [ // ...其他插件 new VueLoaderPlugin() //请确保引入这个插件 ] ``` ## 九 在 webpack 中使用 vue 1. 运行 npm i vue -S 安装 vue 2. 在 src->index.js 入口文件中,通过 import Vue from 'vue' 来导入 vue 构造函数 3. 创建 vue 的实例对象,并制定要控制的 el 区域 4. 通过 render 函数渲染 App 根组件 ``` // 1 导入Vue 构造函数 import Vue from 'vue' // 2 导入 App 根组件 import App from './components/App.vue' const vm = new Vue({ // 3 指定 vm 实例要控制的页面区域 el: '#app', // 4 通过 render 函数,把指定的组件渲染到 el 区域中 render: h = >h(App) }) ``` 5. 在 index.html 文件中 写入 #app 的 div 6. 重启服务,效果如下: ![avator](./img/效果图019.png) 此时,已经把 vue 在 webpack 中用起来了。 注意在 webpack 中都使用 render 函数渲染 vue 组件,不支持 compontent,template 属性 ## 十 webpack 对项目打包发布 上线之前需要通过 webpack 将应用进行整体打包,可以通过 package.json 文件配置打包命令: ``` // 在package.json 文件中配置 webpack 打包命令 // 该命令默认加载项目根目录中的 webpack.config.js 配置文件 "script": { // 用于打包的命令 "build": "webpack -p", // 用于开发调试的命令 "dev": "webpack-dev-server --open --host 127.0.0.1 --port 3000" } ``` 配置完后保存,为了查看效果建议先把项目下的 dist 文件夹删除,然后运行 npm run build 查看 dist 文件下打包生成的文件,就是成品项目,可以交给后端的同学使用 上线发布。 ![avator](./img/效果图020.png)