webpack初步体验

161 阅读3分钟

Webpack主要功能

  • 转义代码(ES6转为ES5,SCSS转为CSS)
  • 构建build
  • 代码压缩
  • 代码分析

学习webpack之前先定几个小目标,一步一步来

  1. 用webpack转义JS
  2. 理解文件名中hash的用途
  3. webpack生成HTML
  4. 用webpack引入CSS
  5. webpack引入SCSS
  6. webpack引入LESS和Stylus
  7. webpack引入图片
  8. 使用懒加载

对于webpack的文档需要选择性的看,而不是都看完

webpack安装

google搜索webpack getting start

按照命令抄

webpack可全局安装也可安装在项目下

我安装在项目下,并且指定版本号

npm install webpack@4 webpack-cli@3 --dev
或者
yarn add webpack@4 webpack-cli@3 --dev

目标一webpack转义JS

接下建一个src目录,src里创建index.js

然后尝试用webpack转义这个js文件

npx webpack //webpack安装在项目下,使用npx,npx会在项目里寻找webpack工具,如果npx失效了可以这么找

./node_modules/.bin/webpack //这样运行webpack

我们多了一个dist目录,里面就是webpack生成的文件

控制台出现警告,使用google搜索webpack configuration mode,找到官网内容

在概念那里的configuration

需要创建webpack.config.js文件,写入以下代码,将./foo.js改为目录下的index.js,运行webpack

var path = require('path');

module.exports = {
  mode: 'development',
  entry: './src/index.js',
  output: {
    filename: 'foo.bundle.js'
  }
};

发现dist目录生成的foo.bundle.js是output里的filename,可以将其改为[name].js再运行webpack,再dist目录得到一个main.js的文件

完成webpack转义js

理解文件名中hash的用途

让打包的文件附带一个hash, 如下

运webpack,结果看main的文件名

为什么要设置成这样

涉及到HTTP缓存---在HTTP响应头中的cache-control可以看到是否使用了HTTP缓存

比如在第一次访问baidu.com, 百度返回几个文件index.html, 1.css, 2.css, 1.js, 2.js, 我们将1.css, 2.css, 1.js,2.js放入缓存或者硬盘中,设置好过期时间。

在第二次访问baidu.com时,只需要下载index.html, 其他文件从内存或者磁盘中获取。

那么这些存入缓存或者磁盘中的文件如何更新,

根据文件名进行更新,如果下载的index.html里引用css,js的文件名与之前存好的文件名不一样,就会进行从新下载这些文件进行更新。

文件名附带hash可以很方便的使文件名不重复,同时解决了文件命名的问题。

webpack生成HTML

google搜索 webpack html, 找到了一HtmlWebpackPlugin,安装

yarn add html-webpack-plugin --dev
或者
npm install html-webpack-plugin --dev
引入
/*webpack.config.js*/

var HtmlWebpackPlugin = require('html-webpack-plugin')
var path = require('path')

module.exports = {
    mode: 'development',
    entry: './src/index.js',
    output: {
        filename: '[name].[contenthash].js'
    },
    plugins: [new HtmlWebpackPlugin()]
}

运行webpack,在dist里就生成了一个html页面

如果要使用自己的规定的html文件,如下配置

先建个自己的html

<!--src/assest/test.html-->
<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <title><%= htmlWebpackPlugin.options.title %></title>
    <meta name="viewport"
        content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
</head>

<body>
    <div id="app1"></div>
</body>

</html>

然后配置,运行webpack看看效果

用webpack引入CSS

google搜索webpack css loader

按照文档,安装,写css,然后引入,好像还需要一个style-loader安装一下,就可以了

使用webpack-dev-server

生成了html文件,那应该如何预览,需要webpack-dev-server,google搜索一下这个,找到其官方文档

安装

yarn add webpack-dev-server --dev

在package.json写入"start":"webpack-dev-server"

然后可以yarn start运行

webpack引入SCSS

先准备一个scss文件

/* src/y.scss */
body{
	background: yellow;
}

然后 index.js里引入

import './y.scss'

需要安装sass-loader 和 dart-sass,不推荐使用node-sass

yarn add sass-loader dart-sass --dev

webpack有时会使用node-sass,如何换成dart-sass

/*webpack.config.js 里的module.rules下*/
{
                test: /\.scss$/i,
                use: [
                    // 将 JS 字符串生成为 style 节点
                    "style-loader",
                    // 将 CSS 转化成 CommonJS 模块
                    "css-loader",
                    // 将 Sass 编译成 CSS
                    {
                        loader: "sass-loader",  
                        options: {
                            implementation: require('dart-sass')  //使用dart-sass
                        }
                    },
                ]
            },

webpack引入LESS和Stylus

引入less和stylus也是和引入scss一样,只是所安装的loader不一样

webpack引入图片

准备好一张图片,如图

在index.js里引入图片,然后把它加到元素里

使用到的loader是file-loader,简单使用

 {
       test: /\.(png|jpe?g|gif)$/i,
       use: [{
            loader: 'file-loader',
       }],
 },

运行即可

使用懒加载

准备一个lazy.js

/* src/lazy.js */
export default function lazy(){
	console..log('我是一个懒加载模块')
}

/* src/index.js */

const button = document.createElement('button')
button.innerText = '懒加载'
button.onclick = () => {
    const promise = import('./lazy')
    promise.then(module => {
        console.log(module)
        const fn = module.default
        fn()
    }, () => {
        console.log('模块加载错误')
    })
}
app1.append(button)

即可,效果是,点击按钮后控制台打印出'我是一个懒加载模块'