webpack学习日记(一) 入门

webpack初学者指南:从入门到精通
这篇博客介绍了webpack的基础使用,包括webpack的概念、如何配置入口与输出、loader的作用、html-webpack-plugin的使用,以及如何在node端通过脚本启动和优化。还涉及webpack-dev-server的配置和生产环境的构建策略,最后提到了性能优化的tree shaking和PWA应用的初步概念。

最近看到了很多webpack的文章,十分有体会,在此将笔记整理出来;

1. 什么是webpack? 

webpack是一款将各种各样的模块打包在一起的工具,即万物皆可为模块化

2.如何开始使用:

创建一个空的项目,接下来

npm init
npm i --save-dev webpack webpack-cli

安装成功后,新建文件夹src,在里面创建src/index.js,src/index.css;

新建webpack.config.js,这个文件是webpack默认会加载的;

在里面进行入口文件,输出文件的配置:

module.exports = {
    // 配置开发环境
    mode:"development",
    //入口文件
  entry:"./src/index.js",
    // 输出文件
    output:{
        path:_dirname+"/dist",
        filename:"[name].[hash].js",
        // 所有资源引用的路径的前缀,可以相对,也可以绝对
       publicPath: "./"
    }
}

上面设置了入口文件与出口文件,其实也可以拥有多个入口文件:

   entry: {
        index: './src/index.js',
        test: './src/test.js'
    }

输出文件使用到了[name]与[hash],这两个都是webpack暴露出来的变量;

其中[hash]是根据内容的变化而产生的变量,每一次修改后都会不一样;

webpack中变量具体原理有时间再深入理解;

配置完毕后,我们在index.js中写上:

import "./index.css"

接下来,我们需要使用webpack的模块化系统去解析这段语句,但是webpack自身是不能识别出来的,怎么办呢?

这个时候webpack最出名的loader就可以大显身手了,所谓loader,是值webpack对模块导入的解析器;

这个时候执行:

npm i --save-dev css-loader style.loader

成功后,在webpack.config.js的module.exports里写上下面语句:

module:{
    test:/\.css/,
    use:["css-loader","style-loader"]
}

上面的语句含义指匹配到.css文件,然后分别使用css-loader与style-loader去处理它;

这个时候,或许你会有疑问?

css-loader跟style.loader都有什么作用啊?为什么要分别引用他们?

其实,css-loader的作用就是解析import "xxx.css",然后解析出来还不够啊,需要插入到页面去啊,这个时候就用到style-loader,将解析出来的css文件以<style></style>的形式插入到html中;

还有一个问题,我们的html文件还没创建呢,这个时候就需要用到html-webpack-plugin这个插件了,安装:

npm i --save-dev html-webpack-plugin

安装完之后在webpack.config.js中添加如下代码:

const HtmlConfigPlugin = require("html-webpack-plugin")
plugins:[new htmlCOnfigPlugin({
    title:"你好"
})]

这个插件非常好用,而且可以自定义html模板,title等;有兴趣可以去了解

好了,万事具备,接下来在cmd执行webpack

打包成功!

3.如何在node端以脚本的形式使用呢?首先创建scripts文件夹,创建start.js,添加以下内容:

const webpack = require("webpack");
// 引入配置文件
const config = require("../webpack.config");
// 将配置文件传入webpack
const compiler = webpack(config);


// 运行node版本的webpack

compiler.run(function (err,stats) {
    if(err){
        console.log(err);
    }else{
        console.log(stats.endTime-stats.startTime);
    }
})

然后,在package.json中,添加到scripts对象里面去;

 "build": "node ./script/start.js",

接着执行npm run build,就可以完成打包了;

基本上到这里,你就掌握了webpack的基本使用了,如果想继续深入,请接着看

3. 优化

打包成功了,但是我们会发现,由于hash,每次我们更新文件之后,都会出现不一样的js文件,手动删除太麻烦,那么怎么办呢?

如果是使用webpack-cli的,直接使用插件方式,然后在webpack.config.js进行配置

const CleanWepackPlugin = require("clean-webpack-plugin");

....config

       plugins: [
     .    ...
        //此处传入的是需要清理的文件夹
        new CleanWepackPlugin(['dist'])
    ]

思路二:

使用node提供的api来处理,在start.js添加如下代码:

// 删除文件以及相关文件夹下的内容
const removeDir = function(path){
    if(fs.existsSync(path)){
        fs.readdirSync(path).forEach(function (filename) {
            let curPath = path+"/"+filename;
            if(fs.lstatSync(curPath).isDirectory()){
                removeDir(curPath)
            }else{
                fs.unlinkSync(curPath)
            }
        });
        fs.rmdirSync(path)
    }
};
let curPath = path.resolve( __dirname , "../dist");
removeDir(curPath);

接着我们运行起来,就可以让系统自动帮我们清除文件了;

5. 创建webpack-dev-server

在vue-cli与create-react-app中,我们经常可以看到修改文件后刷新浏览器的功能,webpack中也提供了watch属性来进行模块重新编译,但是不能自动刷新浏览器;

这个时候,就需要用到webpack-dev-server了,安装

npm i --save-dev webpack-dev-server

在config.js中引入,接着配置devServer

devServer:{
    // 配置devServer当前的目录
    contentBase:"./dist"
}

node端可以这样来做:

在package.json中添加如下代码:

"start": "webpack-dev-server --open"

直接执行npm run start就可以了;

dev-server原理点这里=>原理

6.生产环境配置

需要安装

npm i webpack-merge --save-dev

然后创建webpack.config.prod.js,创建webpack.config.dev.js,创建webpack.base.config.js;

webpack.base.config.js用来作为最基础的配置,其他两个文件分别用来配置不同环境的config

接着,添加

  // package.json
  {
      "scripts": {
          "start": "webpack-dev-server --open --config webpack.dev.conf.js",
          "build": "webpack --config webpack.prod.conf.js"
      }
  }

这样子就可以了;

7. 性能优化:

(1) tree shaking:移除JavaScript文件中的未使用到的代码;

那么如何配置呢?

看此文: tree-shaking

记住几个点:

    需要将babel中的module的modules属性设置为false,禁止es6转换,保留es6模块系统,

接着运行:

webpack --display-used-exports --optimize-minimize

就可以达到效果了;

8.PWA,可以在离线时变成代理服务器,让H5应用能媲美native-app;

它其实是运用了一种浏览器的缓存机制叫cacheStorage, 它提供了一个ServiceWorker类型的工作者或window范围可以访问的所有命名缓存的主目录, 并维护字符串的映射名称到相应的 Cache 对象。

具体实现就不写了,因为我也没实践过;

主要步骤是:主要是使用workbox-webpack-plugin,然后运用了navigator中的serviceWorker对象来进行操作;

 

本文参考掘金大佬的:浅入浅出webpack

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值