Webpack 原理与实践之如何使用 Webpack 实现模块化打包?

本文转载自微信公众号「前端万有引力」,原用作者一川。理实转载本文请联系前端万有引力公众号。何使化打

写在前面

我们知道当前生产中主流的实现模块化打包工具有Webpack、Parcel和Rollup。模块作为模块化打包工具,原用它们基本的理实特点有:

能够将散落的模块打包在一起 能够编译转换代码中的新特性,使得可以兼容各种生产环境

对于主流的何使化打webpack而言,webpack作为一个模块打包工具,实现自身就可以实现模块化代码打包的模块问题,通过webpack可以将零散的原用JS代码打包到一个JS文件中。对于有环境兼容性问题的理实代码,webpack可以在代码打包过程中通过loader机制对其实现编译转换,何使化打然后再进行打包。实现对于不同类型的模块前端模块,webpack支持在js中以模块化的方式载入任意类型的资源文件,例如:可以通过webpack实现在JS中加载CSS文件,被加载的CSS文件会以style标签的方式工具。

webpack还具备代码拆分的能力,能够将应用中所有的网站模板模块按需分块打包,不用担心全部代码打包到一起,产生单个文件过大,导致加载慢的问题。这种模块按需分块打包非常适合大型web项目。

Webpack上路

Webpack作为主流的前端模块打包器,提供了一整套前端项目模块化方案,而不仅仅局限于JS的模块化,可以实现对前端项目开发过程中涉及到的资源进行模块化。

我们知道ES Modules中制定的html中使用script导入js模块,需要设定type="module",用来区分加载的是普通JS脚本还是一个模块。对于支持ES Modules的浏览器可以直接使用,但是对于不支持的浏览器就会报错,因此需要使用webpack模块打包工具避免报错。

<script src="./index.js" type="module"></script>  // heading.js export default function(){    const element = document.createElement("div");   element.textContent = "hello yichuan";   element.addEventListener("click",()=>{      console.log("hello onechuan");     return element   }) } // index.js import createHeader  from "./heading.js"; document.body.append(createHeader()) 

对于,我们需要先安装webpack的核心模块和cli程序,用于在命令行中调用webpack。npx是npm5.2以后新增的一个命令,服务器托管可以更方便地执行远程模块或者项目node_modules中的cli程序。

$ npm init --yes $ npm i webpack webpack-cli -D $ npx webpack --version $ npx webpack 

通过执行npx webpack实现自动化打包,webpack会默认从src/index.js文件开始打包,打包完毕后会在根目录下生产dist目录,所有打包文件会在dist目录。

|--dist   |--main.js  (()=>{ "use strict";document.body.append(function(){ const e=document.createElement("div");e.textContent="hello yichuan",e.addEventListener("click",(()=>(console.log("hello onechuan"),e)))}())})(); 

webpack4.0以后的版本支持零配置的方式直接启动打包,整个过程会按照约定将src/index.js文件作为打包入口,最终打包的结果会存放到dis/main.js中。但是,很多时候webpack的默认规则并能满足我们实际需求,对此我们需要对webpack进行自定义配置。

webpack支持在项目中创建webpack.config.js文件进行自定义打包配置,由于webpack是运行在node.js环境,对应应该遵守CommonJS规则进行导入导出。

|--backpack   |--src     |--heading.js     |--main.js   |--index.html   |--package.json   |--webpack.config.js-------webpack配置文件 

webpack自定义的配置文件:

// webpack.config.js const path = require("path"); module.exports = {    entry:"./src/index.js",//打包入口   output:{ //打包出口     filename:"bundle.js",//命名打包后的文件     path:path.join(__dirname,"output")   },   // 打包模式   mode:"none" } 

执行打包命令后会在项目根目录下自动生成打包后的文件目录,我们看到下面是执行打包命令后生成的文件,生成的是一个立即执行函数。

/
滇ICP备2023000592号-31