目录
什么是 webpack?
webpack 可以用来做什么
在网页中会引用哪些常见的静态资源?
网页中引入的静态资源多了以后有什么问题???
如何解决上述两个问题
如何完美实现上述的 2 种解决方案
webpack 安装的两种方式
初步使用 webpack 打包构建列表隔行变色案例
使用 webpack 的配置文件简化打包时候的命令
实现 webpack 的实时打包构建
使用 html-webpack-plugin 插件配置启动页面
实现自动打开浏览器, 热更新和配置浏览器的默认端口号
方式 1:
方式 2:
webpack 打包文件
使用 webpack 打包 CSS 文件
使用 webpack 打包 Less 文件
使用 webpack 打包 Sass 文件
使用 webpack 处理 CSS 中的路径
使用 babel 处理高级 JS 语法
注意点
在普通页面中使用 render 函数渲染组件
在 webpack 中配置. vue 组件页面的解析
在使用 webpack 构建的 Vue 项目中使用模板对象?
什么是 webpack?
webpack 是前端的一个项目构建工具, 它是基于 Node.JS 开发出来的一个前端工具;
webpack 可以用来做什么
在网页中会引用哪些常见的静态资源?
- JS
- .JS .jsx .coffee .ts(TypeScript 类 C# 语言)
- CSS
- .CSS .Less .Sass .SCSS
- Images
- .jpg .PNG .gif .bmp .svg
字体文件(Fonts)
.svg .ttf .eot .woff .woff2
模板文件
.ejs .jade .vue[这是在 webpack 中定义组件的方式, 推荐这么用]
网页中引入的静态资源多了以后有什么问题???
网页加载速度慢, 因为 我们要发起很多的二次请求;
要处理错综复杂的依赖关系
如何解决上述两个问题
合并, 压缩, 精灵图, 图片的 Base64 编码
可以使用之前学过的 RequireJS, 也可以使用 webpack 可以解决各个包之间的复杂依赖关系;
如何完美实现上述的 2 种解决方案
使用 Gulp, 是基于 task 任务的;
使用 Webpack, 是基于整个项目进行构建的;
借助于 webpack 这个前端自动化构建工具, 可以完美实现资源的合并, 打包, 压缩, 混淆等诸多功能.
根据官网的图片介绍 webpack 打包的过程
webpack 官网 https://webpack.github.io/
webpack 安装的两种方式
运行 NPM i webpack -g 全局安装 webpack, 这样就能在全局使用 webpack 的命令
在项目根目录中运行
NPM i webpack --save-dev
安装到项目依赖中
初步使用 webpack 打包构建列表隔行变色案例
运行 NPM init 初始化项目, 使用 NPM 管理项目中的依赖包
创建项目基本的目录结构
使用
cnpm i jQuery --save
安装 jQuery 类库
创建 main.JS 并书写各行变色的代码逻辑:
- // 导入 jQuery 类库
- import $ from 'jquery'
- // 设置偶数行背景色, 索引从 0 开始, 0 是偶数
- $('#list li:even').CSS('backgroundColor','lightblue');
- // 设置奇数行背景色
- $('#list li:odd').CSS('backgroundColor','pink');
直接在页面上引用 main.JS 会报错, 因为浏览器不认识 import 这种高级的 JS 语法, 需要使用 webpack 进行处理, webpack 默认会把这种高级的语法转换为低级的浏览器能识别的语法;
运行
webpack 入口文件路径 输出文件路径
对 main.JS 进行处理:
webpack src/JS/main.JS dist/bundle.JS
使用 webpack 的配置文件简化打包时候的命令
在项目根目录中创建 webpack.config.JS
由于运行 webpack 命令的时候, webpack 需要指定入口文件和输出文件的路径, 所以, 我们需要在 webpack.config.JS 中配置这两个路径:
- // 导入处理路径的模块
- var path = require('path');
- // 导出一个配置对象, 将来 webpack 在启动的时候, 会默认来查找 webpack.config.JS, 并读取这个文件中导出的配置对象, 来进行打包处理
- module.exports = {
- entry: path.resolve(__dirname, 'src/js/main.js'), // 项目入口文件
- output: { // 配置输出选项
- path: path.resolve(__dirname, 'dist'), // 配置输出的路径
- filename: 'bundle.js' // 配置输出的文件名
- }
- }
实现 webpack 的实时打包构建
由于每次重新修改代码之后, 都需要手动运行 webpack 打包的命令, 比较麻烦, 所以使用 webpack-dev-server 来实现代码实时打包编译, 当修改代码之后, 会自动进行打包构建.
运行
cnpm i webpack-dev-server --save-dev
安装到开发依赖
安装完成之后, 在命令行直接运行 webpack-dev-server 来进行打包, 发现报错, 此时需要借助于 package.JSON 文件中的指令, 来进行运行 webpack-dev-server 命令, 在 scripts 节点下新增
"dev": "webpack-dev-server"
指令, 发现可以进行实时打包, 但是 dist 目录下并没有生成 bundle.JS 文件, 这是因为 webpack-dev-server 将打包好的文件放在了内存中
把 bundle.JS 放在内存中的好处是: 由于需要实时打包编译, 所以放在内存中速度会非常快
这个时候访问 webpack-dev-server 启动的
http://localhost:8080/
网站, 发现是一个文件夹的面板, 需要点击到 src 目录下, 才能打开我们的 index 首页, 此时引用不到 bundle.JS 文件, 需要修改 index.HTML 中 script 的 src 属性为:
<script src="../bundle.js"></script>
为了能在访问
http://localhost:8080/
的时候直接访问到 index 首页, 可以使用 --contentBase src 指令来修改 dev 指令, 指定启动的根目录:
"dev": "webpack-dev-server --contentBase src"
同时修改 index 页面中 script 的 src 属性为 < script src="bundle.js"></script>
使用 HTML-webpack-plugin 插件配置启动页面
由于使用 --contentBase 指令的过程比较繁琐, 需要指定启动的目录, 同时还需要修改 index.HTML 中 script 标签的 src 属性, 所以推荐大家使用 HTML-webpack-plugin 插件配置启动页面.
运行
cnpm i HTML-webpack-plugin --save-dev
安装到开发依赖
修改 webpack.config.JS 配置文件如下:
- // 导入处理路径的模块
- var path = require('path');
- // 导入自动生成 HTML 文件的插件
- var htmlWebpackPlugin = require('html-webpack-plugin');
- module.exports = {
- entry: path.resolve(__dirname, 'src/js/main.js'), // 项目入口文件
- output: { // 配置输出选项
- path: path.resolve(__dirname, 'dist'), // 配置输出的路径
- filename: 'bundle.js' // 配置输出的文件名
- },
- plugins:[ // 添加 plugins 节点配置插件
- new htmlWebpackPlugin({
- template:path.resolve(__dirname, 'src/index.html'),// 模板路径
- filename:'index.html'// 自动生成的 HTML 文件的名称
- })
- ]
- }
修改 package.JSON 中 script 节点中的 dev 指令如下:
"dev": "webpack-dev-server"
将 index.HTML 中 script 标签注释掉, 因为 HTML-webpack-plugin 插件会自动把 bundle.JS 注入到 index.HTML 页面中!
实现自动打开浏览器, 热更新和配置浏览器的默认端口号
注意: 热更新在 JS 中表现的不明显, 可以从一会儿要讲到的 CSS 身上进行介绍说明!
方式 1:
修改 package.JSON 的 script 节点如下, 其中 --open 表示自动打开浏览器,--port 4321 表示打开的端口号为 4321,--hot 表示启用浏览器热更新:
"dev": "webpack-dev-server --hot --port 4321 --open"
方式 2:
修改 webpack.config.JS 文件, 新增 devServer 节点如下:
- devServer:{
- hot:true,
- open:true,
- port:4321
- }
在头部引入 webpack 模块:
var webpack = require('webpack');
在 plugins 节点下新增:
new webpack.HotModuleReplacementPlugin()
webpack 打包文件
使用 webpack 打包 CSS 文件
运行
cnpm i style-loader CSS-loader --save-dev
修改 webpack.config.JS 这个配置文件:
- module: { // 用来配置第三方 loader 模块的
- rules: [ // 文件的匹配规则
- { test: /\.CSS$/, use: ['style-loader', 'css-loader'] }// 处理 CSS 文件的规则
- ]
- }
注意: use 表示使用哪些模块来处理 test 所匹配到的文件; use 中相关 loader 模块的调用顺序是从后向前调用的;
使用 webpack 打包 Less 文件
运行
cnpm i Less-loader Less -D
修改 webpack.config.JS 这个配置文件:
{ test: /\.Less$/, use: ['style-loader', 'css-loader', 'less-loader'] },
使用 webpack 打包 Sass 文件
运行
cnpm i Sass-loader node-Sass --save-dev
在 webpack.config.JS 中添加处理 Sass 文件的 loader 模块:
{ test: /\.SCSS$/, use: ['style-loader', 'css-loader', 'sass-loader'] }
使用 webpack 处理 CSS 中的路径
运行
cnpm i url-loader file-loader --save-dev
在 webpack.config.JS 中添加处理 url 路径的 loader 模块:
{ test: /\.(PNG|jpg|gif)$/, use: 'url-loader' }
可以通过 limit 指定进行 base64 编码的图片大小; 只有小于指定字节 (byte) 的图片才会进行 base64 编码:
{ test: /\.(PNG|jpg|gif)$/, use: 'url-loader?limit=43960' },
使用 babel 处理高级 JS 语法
运行
cnpm i babel-core babel-loader babel-plugin-transform-runtime --save-dev
安装 babel 的相关 loader 包
运行
cnpm i babel-preset-es2015 babel-preset-stage-0 --save-dev
安装 babel 转换的语法
在 webpack.config.JS 中添加相关 loader 模块, 其中需要注意的是, 一定要把 node_modules 文件夹添加到排除项:
{ test: /\.JS$/, use: 'babel-loader', exclude: /node_modules/ }
在项目根目录中添加. babelrc 文件, 并修改这个配置文件如下:
- {
- "presets":["es2015", "stage-0"],
- "plugins":["transform-runtime"]
- }
注意: 语法插件 babel-preset-es2015 可以更新为 babel-preset-env, 它包含了所有的 ES 相关的语法;
注意点
有时候使用 NPM i node-Sass -D 装不上, 这时候, 就必须使用 cnpm i node-Sass -D
在普通页面中使用 render 函数渲染组件
在 webpack 中配置. vue 组件页面的解析
运行 cnpm i vue -S 将 vue 安装为运行依赖;
运行
cnpm i vue-loader vue-template-compiler -D
将解析转换 vue 的包安装为开发依赖;
运行
cnpm i style-loader CSS-loader -D
将解析转换 CSS 的包安装为开发依赖, 因为. vue 文件中会写 CSS 样式;
在 webpack.config.JS 中, 添加如下 module 规则:
- module: {
- rules: [
- { test: /\.CSS$/, use: ['style-loader', 'css-loader'] },
- { test: /\.vue$/, use: 'vue-loader' }
- ]
- }
创建 App.JS 组件页面:
- <template>
- <!-- 注意: 在 .vue 的组件中, template 中必须有且只有唯一的根元素进行包裹, 一般都用 div 当作唯一的根元素 -->
- <div>
- <h1 > 这是 App 组件 - {{msg}}</h1>
- <h3 > 我是 h3</h3>
- </div>
- </template>
- <script>
- // 注意: 在 .vue 的组件中, 通过 script 标签来定义组件的行为, 需要使用 ES6 中提供的 export default 方式, 导出一个 vue 实例对象
- export default {
- data() {
- return {
- msg: 'OK'
- }
- }
- }
- </script>
- <style scoped>
- h1 {
- color: red;
- }
- </style>
创建 main.JS 入口文件:
- // 导入 Vue 组件
- import Vue from 'vue'
- // 导入 App 组件
- import App from './components/App.vue'
- // 创建一个 Vue 实例, 使用 render 函数, 渲染指定的组件
- var vm = new Vue({
- el: '#app',
- render: c => c(App)
- });
在使用 webpack 构建的 Vue 项目中使用模板对象?
在 webpack.config.JS 中添加 resolve 属性:
- resolve: {
- alias: {
- 'vue$': 'vue/dist/vue.esm.js'
- }
- }
来源: http://www.bubuko.com/infodetail-3358535.html