这篇文章主要介绍了webpack
使用的一个小demo,来学习如何利用webpack
构建项目,以及打包js
文件,通过安装loader模块打包css
,less
,sass
等文件。
1. nrm
(牛肉面)的安装使用
作用:提供了一些最常用的NPM包镜像地址,能够让我们快速的切换安装包时候的服务器地址;
什么是镜像:原来包刚一开始是只存在于国外的NPM服务器,但是由于网络原因,经常访问不到,这时候,我们可以在国内,创建一个和官网完全一样的NPM服务器,只不过,数据都是从人家那里拿过来的,除此之外,使用方式完全一样;
- 运行
npm i nrm -g
全局安装nrm
包; - 使用
nrm ls
查看当前所有可用的镜像源地址以及当前所使用的镜像源地址; - 使用
nrm use npm
或nrm use taobao
切换不同的镜像源地址;
注意: nrm 只是单纯的提供了几个常用的 下载包的 URL地址,并能够让我们在 这几个 地址之间,很方便的进行切换,但是,我们每次装包的时候,使用的 装包工具,都是 npm
2. webpack认识
-
2.1 常见的网页静态资源
1. JS资源 - .js .jsx .coffee .ts(TypeScript 类 C# 语言) 2. CSS资源 - .css .less .sass .scss 3. Images资源 - .jpg .png .gif .bmp .svg 4. 字体文件(Fonts)资源 - .svg .ttf .eot .woff .woff2 5. 模板文件资源 - .ejs .jade .vue【webpack中定义组件的方式,推荐】
-
2.2 网页中引入静态资源后出现问题以及解决方法
引入静态资源后出现问题? 1. 因为要发起很多的二次请求导致网页加载速度慢 2. 要处理错综复杂的依赖关系 解决方法: 1. 合并、压缩、精灵图、图片的Base64编码 2. 可以使用之前学过的requireJS、也可以使用webpack解决各个包之间的复杂依赖关系; 使用Gulp和webpack的区别: a. Gulp是基于 task 任务的; b. Webpack是基于整个项目进行构建的; - 借助于webpack这个前端自动化构建工具,可以完美实现资源的合并、打包、压缩、混淆等诸多功能。 - [webpack官网](https://webpack.github.io/)
-
2.3 什么是
webpack
?webpack
是前端项目构建工具,她是基于node.js
开发出来的
3. 使用webpack
构建隔行变色的小demo
-
3.1 安装
webpack
# 1.全局安装 npm i webpack -g # 默认安装最新版@4.28.1 由于webpack版本兼容问题,降低安装版本解决问题 npm i [email protected] -g # 2.在项目根目录中运行下面命令安装到项目依赖中,否则无法使用webpack-dev-server npm i [email protected] --save-dev
-
3.2 初始化项目,使用npm管理项目中的依赖包
npm init -y
-
3.3 创建项目基本目录结构
├─dist 最终要发布的版本文件夹 ├─src 开发中要用到的静态资源 ├──css css样式、less、sass等 ├──js js文件 ├──images 图片资源 ├──index.html 首页 └──main.js 项目入口 ├─node_modules 第三方包(生成) ├─package.json 包的描述文件(生成) ├─package-lock.json 第三方包版本锁定文件(生成,npm5+才有) └─webpack.config.js webpack配置文件
-
3.4 在项目中安装
jquery
npm i jquery -D
-
3.5 创建main.js
// 导入jquery类库 import $ from 'jquery' // 设置偶数行背景色,索引从0开始 $('li:even').css('backgroundColor','cyan'); // 设置奇数行背景色 $('li:odd').css('backgroundColor','gray');
直接在页面上引用
main.js
会报错,因为浏览器不认识import
这种高级的es6
语法,需要使用webpack
进行处理,webpack
默认会把这种高级的语法转换为低级的浏览器能识别的语法。命令行运行下面命令对
main.js
进行打包处理:# webpack 入口文件路径 输出文件路径 webpack src/js/main.js dist/bundle.js
运行完成后,在
index.html
中引入bundle.js
在浏览器中打开就可以实现隔行变色效果了。
4. 基于隔行变色demo使用webpack
的配置文件简化打包过程
-
4.1 在项目根目录中创建
webpack.config.js
// 运行webpack命令时需要指定入口文件和输出文件的路径,我们在webpack.config.js中配置这两个路径 // 导入处理路径的模块 var path = require('path'); var config = { entry: path.resolve(__dirname, 'src/js/main.js'), // 项目入口文件 output: { // 配置输出选项 path: path.resolve(__dirname, 'dist'), // 配置输出的路径 filename: 'bundle.js' // 配置输出的文件名 } } // 导出一个配置对象,将来webpack在启动的时候,会默认来查找webpack.config.js,并读取这个文件中导出的配置对象,来进行打包处理 module.exports = config; // 当我们在 控制台,直接输入 webpack 命令执行的时候,webpack 做了以下几步: // 1. 首先,webpack 发现,我们并没有通过命令的形式,给它指定入口和出口 // 2. webpack 就会去 项目的 根目录中,查找一个叫做 `webpack.config.js` 的配置文件 // 3. 当找到配置文件后,webpack 会去解析执行这个 配置文件,当解析执行完配置文件后,就得到了 配置文件中,导出的配置对象 // 4. 当 webpack 拿到 配置对象后,就拿到了 配置对象中,指定的 入口 和 出口,然后进行打包构建;
配置好
webpack.config.js
文件后,在命令行中输入webpack
回车就能实现打包了,每次修改代码之后运行webpack
命令进行打包处理,然后到页面刷新看见修改后的变化。 -
4.2 使用
webpack-dev-server
这个工具来实现自动打包编译的功能# 安装webpack-dev-server 指定版本 npm i [email protected] -D # 安装完毕后,这个工具的用法和 webpack 命令的用法完全一样 # 由于在项目中本地安装的webpack-dev-server所以无法把它当作 脚本命令 在命令行(powershell)中直接运行 # 只有那些安装到全局 -g 的工具,才能在 终端中正常执行 # 注意: webpack-dev-server 这个工具,如果想要正常运行,要求在本地项目中,必须安装 webpack,这就是为什在开始已经全局安装webpack的时候还要进行一次项目安装 npm i [email protected] --save-dev # webpack-dev-server 帮我们打包生成的 bundle.js 文件,并没有存放到 实际的 物理磁盘上;而是直接托管到了电脑的内存中,所以我们在项目根目录中根本找不到这个打包好的 bundle.js; # 我们可以认为 webpack-dev-server 把打包好的文件,以一种虚拟的形式托管到了项目的根目录中,虽然我们看不到它,但是可以认为, 和 dist src node_modules 是平级,有一个看不见的文件,叫做 bundle.js
安装完成后在命令行直接运行
webpack-dev-server
进行打包,发现报错,此时需要借助package.json
文件中的指令来运行webpack-dev-server
命令,在scripts
节点下新增"dev": "webpack-dev-server"
指令,发现可以进行实时打包,但是dist目录下并没有生成bundle.js
文件,这是因为webpack-dev-server
将打包好的文件放在了内存中。"scripts": { "dev": "webpack-dev-server" }
# 命令行中运行 npm run dev
把
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>
-
4.3 使用
html-webpack-plugin
插件配置启动页面由于使用
--contentBase
指令的过程比较繁琐,需要指定启动的目录,同时还需要修改index.html
中script标签的src
属性,所以推荐大家使用html-webpack-plugin
插件配置启动页面-
a. 运行
npm i [email protected] --save-dev
安装到开发依赖npm i [email protected] --save-dev
-
b. 修改
webpack.config.js
配置文件如下:// 导入处理路径的模块 var path = require('path'); // 导入自动生成HTMl文件的插件 var htmlWebpackPlugin = require('html-webpack-plugin'); var config = { 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文件的名称 }) ] }; module.exports = config;
-
c. 修改
package.json
中script
节点中的dev
指令如下:"dev": "webpack-dev-server"
-
d. 将
index.html
中script标签注释掉,因为html-webpack-plugin
插件会自动把bundle.js
注入到index.html
页面中!
-
5. 基于上面的demo实现自动打开浏览器、热更新和配置浏览器的默认端口号
-
方法一:
修改
package.json
的script节点如下,其中--open
表示自动打开浏览器,--port 3000
表示打开的端口号为3000,--hot
表示启用浏览器热更新。"dev": "webpack-dev-server --hot --port 3000 --open"
-
方法二:
a. 修改
webpack.config.js
文件,新增devServer
节点如下:devServer:{ open: true, // 自动打开浏览器 port: 3000, // 设置启动时候的运行端口 contentBase: 'src', // 指定托管的根目录 hot: true // 启用热更新 第1步 }
b. 在头部引入
webpack
模块:// 启用热更新 第2步 引入webpack包 var webpack = require('webpack');
c. 在
plugins
节点下新增:plugins: [ // 配置插件节点 new webpack.HotModuleReplacementPlugin(), // new 一个热更新模块对象,这是启用热更新 第 3 步 ]
6. 使用webpack
打包css
,less
,sass
文件
-
打包
css
文件a. 安装loader模块
npm i [email protected] [email protected] --save-dev
b. 修改
webpack.config.js
这个配置文件:module: { // 用来配置第三方loader模块的 rules: [ // 文件的匹配规则 { test: /\.css$/, use: ['style-loader', 'css-loader'] }//处理css文件的规则 ] } // 注意:`use`表示使用哪些模块来处理`test`所匹配到的文件 // `use`中相关loader模块的调用顺序是从后向前调用的
-
打包
less
文件a. 安装loader模块
npm i [email protected] [email protected] -D
b. 修改
webpack.config.js
这个配置文件,在rules中添加:{ test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] }
-
打包
sass
文件a. 安装loader模块
npm i [email protected] [email protected] --save-dev
b. 修改
webpack.config.js
这个配置文件,在rules中添加:{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] }
c. 备注:安装node-sass时如果安装不成功,可在通过下面网址提供的方法本地安装
https://www.cnblogs.com/codebook/p/10274990.html
7. 备注:隔行变色demo文件
-
main.js
// main.js是项目入口文件 // 导入jquery -- import ** from ** 是es6的语法导入模块方式 import $ from 'jquery'; // 利用 import 语法 导入样式表 import './css/index.css'; import './css/index.less'; import './css/index.scss'; $(function (){ $('li:odd').css('backgroundColor', 'cyan'); $('li:even').css('backgroundColor', function (){ return '#' + 'ddd' }) });
-
webpack.config.js
const path = require('path'); const webpack = require('webpack'); // 导入 在内存中生成 HTML 页面的 插件 const htmlWebpackPlugin = require('html-webpack-plugin'); // 这个js配置文件,通过node中的模块操作,向外暴露一个配置对象 const config = { // 入口,表示webpack要打包哪个文件 entry: path.join(__dirname, './src/main.js'), // 出口相关配置 output: { path: path.join(__dirname, './dist'), // 指定打包好的文件输出到哪个路径 filename: 'bundle.js' // 指定输出文件名称 }, devServer: { // 这是配置 dev-server 命令参数的第二种形式,这种方式相对麻烦一些,也是在命令行使用 npm run dev 执行 //推荐在package.json中使用命令 --open --port 3000 --contentBase src --hot open: true, // 自动打开浏览器 port: 3000, // 设置启动时候的运行端口 contentBase: 'src', // 指定托管的根目录 hot: true // 启用热更新 第1步 }, plugins: [ // 配置插件节点 new webpack.HotModuleReplacementPlugin(), // new 一个热更新模块对象,这是启用热更新 第 3 步 new htmlWebpackPlugin({ // 创建一个在内存中 生成 HTML 页面的插件 template: path.join(__dirname, './src/index.html'), // 指定模板页面,将来会根据指定的页面路径,去生成内存中的页面 filename: 'index.html' // 指定生成的页面的名称 }) ], module: { // 匹配所有第三方模块加载器 rules: [ // 所有第三方模块 匹配规则 { test: /\.css$/, use: ['style-loader', 'css-loader'] }, { test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] }, { test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] } ] } }; module.exports = config;
-
package.json
( 注意:json文件中不能有注释 ){ "name": "webpack-demo", "version": "1.0.0", "description": "", "main": "webpack.config.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "dev2": "webpack-dev-server --open --port 3000 --contentBase src --hot", "dev": "webpack-dev-server" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "css-loader": "^0.28.7", "html-webpack-plugin": "^2.30.1", "less": "^2.7.3", "less-loader": "^4.0.5", "node-sass": "^4.11.0", "sass-loader": "^6.0.6", "style-loader": "^0.19.0", "webpack": "^3.8.1", "webpack-dev-server": "^2.9.3" }, "dependencies": { "jquery": "^3.3.1" } }