webpack学习笔记--基本配置

简介: webpack学习笔记--基本配置

前言

《深入浅出webpack》里如是描述webpack:“Webpack是一个打包模块化 JavaScript 的工具,在 Webpack 切文件皆模块,通过 Loader 转换文件,通过 Plugin 注入钩子,最后输出由多个模块组合成的 文件。 Webpack 专注于构建模块化项目。”以此文章来记录一下webpack的常用配置。

HelloWorld

我们先来写几行简单的js代码

show.js

function show(content) {
    window.document.getElementById('app').innerText = `Hello,${content}`
}
module.exports = show
main.js
const show = require('./show.js')
show('webpack')

现在来编写简单的 webpack.config.js

const path = require('path')
module.exports = {
    mode: 'development', //webpack有两种模式,1生产模式production 2开发模式development
    entry: './src/index.js',//入口
    output: {
        filename: 'bundle.js',//打包后的文件名
        path: path.resolve(__dirname, './dist') //路径必须是一个绝对路径    
    }
}

再创建一个html文件,把我们打包生成的bundle.js引入其中,打开浏览器看看是不是符合预期效果

<!DOCTYPE html><html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title></head>
<body>
    <div id="app"></div>
    <script src="./dist/bundle.js"></script>
</body>
</html>

如上所示,我们的打包是成功滴。


bundle.js

那我们再来看看它打包出来的文件是怎样的吧!

(function (modules){ // webpackBootstrap
````
}
({
   "./main.js":
     (function (module, exports, __webpack_require__) {
       eval("const show = __webpack_require__(/*! ./show.js */ \"./show.js\")\r\nshow('webpack')\n\n//# sourceURL=webpack:///./main.js?");     }),
   "./show.js":     (function (module, exports) {
       eval("function show(content) {\r\n    window.document.getElementById('app').innerText = `Hello,${content}`\r\n}\r\nmodule.exports = show\n\n//# sourceURL=webpack:///./show.js?");
     })
})

我们发现bundle.js其实是一个自执行函数,参数为modules。而我们这里传入的参数是一个对象,key是我们文件的名字,value就是我们写的函数。我们再来详细看看里面做了什么事情。

首先一开始定义了一个 installedModules对象,用来作为缓存。

然后就是一个 __webpack_require__函数

   function __webpack_require__(moduleId) {
     // 检查模块是否在缓存中,如果在就直接返回,一开始我们的模块是不在缓存中的,所以要走下面的逻辑
     if (installedModules[moduleId]) {
       return installedModules[moduleId].exports;
     }
     // 创建一个新模块,并把它添加进缓存中,webpack是以moduleId来区分模块的
     var module = installedModules[moduleId] = {
       i: moduleId, 
       l: false,//是否已安装
       exports: {}
     };
     //call传入的函数
     modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
     module.l = true;
     return module.exports; 
  }

在一整个自执行函数的最后面有这么一句话

return __webpack_require__(__webpack_require__.s = "./main.js");

这里就开始了以main.js为入口开始安装依赖,再看回这个自执行函数传入的参数,又调用了一次__webpack_require__方法,由此我们可以看出webpack会一直深度递归安装所有依赖。

webpack-dev-server

但是我们直接打开html文件这种做法似乎有点low,这里就可以用到这一个插件,它内置了一个express,可以帮我们启动一个本地服务。

此时的webpack.config.js变成了这样


const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
    devServer: {
        //开发服务器的配置
        port: 3000, //端口号
        progress: true, //进度条
        contentBase: './build',
    },
    mode: 'development', 
    entry: './src/index.js', 
    output: {
        filename: 'bundle.js', 
        path: path.resolve(__dirname, './dist') 
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: './src/index.html',
            filename: 'index.html',
        })
    ]}

devServer里就是我们开发服务器中的配置,这里要注意的是我们要告诉它以那个目录为基本来启动这个开发服务器,所以我们要填写一个contentBase,除此之外呢,我们还要告诉它以哪个html文件为模板,这样它就可以帮我们把打包的js文件自动填充到模板中。

执行npx webpack-dev-server后,打开localhost:3000就可以看到我们的页面了

这里其实我们还可以在package.json中配置两条脚本命令

  "scripts": {
    "build": "npx webpack",
    "dev": " npx webpack-dev-server"
  },

这样我们就可以用npm run dev来启动我们的开发服务了

样式处理

  • 插入style标签

我们知道webpack打包出来的东西全是js,这里我们需要使用loader来做样式处理。

index.css

@import('./font-color.css')
body {background-color: red}

font-color.css

body{color:pink}

index.js

require('./index.css')

webpack.config.js中,我们如是配置

    module: {
        rules: [{
            test: /\.css$/,
            use: ['style-loader', 'css-loader'] 
        }]
    }
//css-loader 处理@import这种语法 style-loader 把样式插入到head标签中

在这里,css-loader是用来处理@importurl()这种语法的,而style-loader则将我们的样式插入到head标签中。值得一提的是,loader的执行顺序是数组内从右到左。

让我们来看看打包后的效果。

可以看到我们的css代码被插入到了head标签中。

  • css抽离

那如果我们不想将太多样式直接插入其中,这里可以用到一个插件mini-css-extract-plugin

此时配置如下

module: {
        rules: [{
            test: /\.css$/,
            use: [MiniCssExtractPlugin.loader, 'css-loader']
        }]
}
plugins: [
        //抽离css样式
        new MiniCssExtractPlugin({
            filename: 'main.css'
        })
],

这时打包后再来看index.html,发现多了个link标签,而此时的dist目录下也多了一个main.css,对应上面我们的配置

后记

这里记录了一些webpack最基本的配置,希望继续学习下去之后,能有更多的东西记录与分享。如有错漏,恳请指出。您的批评和指正是我前进路上的一大动力。


相关文章
|
20天前
|
JavaScript 前端开发 UED
如何配置 Webpack 进行代码分离?
通过以上方法,可以有效地配置Webpack进行代码分离,根据项目的具体需求和场景选择合适的方式,能够显著提高应用的性能和用户体验。在实际应用中,还可以结合其他优化技术,进一步优化Webpack的打包结果和应用的加载速度。
37 5
|
20天前
|
前端开发 JavaScript
webpack相关配置
以上只是Webpack配置的一些常见部分,实际应用中还可以根据具体的项目需求和场景进行更复杂和细致的配置,以满足不同的构建和优化要求。
36 2
|
20天前
|
缓存 JavaScript 前端开发
配置 Webpack 进行代码分离的常见方法有哪些?
通过以上常见方法,可以根据项目的具体需求和场景,灵活地配置Webpack进行代码分离,从而提高应用的性能和加载速度,优化用户体验。
23 3
|
27天前
|
缓存 前端开发 JavaScript
前端性能优化:Webpack与Babel的进阶配置与优化策略
【10月更文挑战第28天】在现代Web开发中,Webpack和Babel是不可或缺的工具,分别负责模块打包和ES6+代码转换。本文探讨了它们的进阶配置与优化策略,包括Webpack的代码压缩、缓存优化和代码分割,以及Babel的按需引入polyfill和目标浏览器设置。通过这些优化,可以显著提升应用的加载速度和运行效率,从而改善用户体验。
42 6
|
29天前
|
缓存 监控 前端开发
前端工程化:Webpack与Gulp的构建工具选择与配置优化
【10月更文挑战第26天】前端工程化是现代Web开发的重要趋势,通过将前端代码视为工程来管理,提高了开发效率和质量。本文详细对比了Webpack和Gulp两大主流构建工具的选择与配置优化,并提供了具体示例代码。Webpack擅长模块化打包和资源管理,而Gulp则在任务编写和自动化构建方面更具灵活性。两者各有优势,需根据项目需求进行选择和优化。
62 7
|
1月前
|
前端开发
配置 Webpack 实现热更新
【10月更文挑战第23天】还可以进一步深入探讨热更新的具体实现细节、不同场景下的应用案例,以及如何针对特定需求进行优化等方面的内容。通过全面、系统地了解 Webpack 热更新的配置方法,能够更好地利用这一功能,提升项目的开发效率和性能表现。同时,要不断关注 Webpack 及相关技术的发展动态,以便及时掌握最新的热更新技术和最佳实践。
|
28天前
|
缓存 前端开发 JavaScript
前端工程化:Webpack与Gulp的构建工具选择与配置优化
【10月更文挑战第27天】在现代前端开发中,构建工具的选择对项目的效率和可维护性至关重要。本文比较了Webpack和Gulp两个流行的构建工具,介绍了它们的特点和适用场景,并提供了配置优化的最佳实践。Webpack适合大型模块化项目,Gulp则适用于快速自动化构建流程。通过合理的配置优化,可以显著提升构建效率和性能。
35 2
|
1月前
|
存储 缓存 监控
配置 Webpack 5 持久化缓存时需要注意哪些安全问题?
【10月更文挑战第23天】通过全面、系统地分析和应对安全问题,能够更好地保障 Webpack 5 持久化缓存的安全,为项目的成功构建和运行提供坚实的安全基础。同时,要保持对安全技术的关注和学习,不断提升安全防范能力,以应对日益复杂的安全挑战。
|
2月前
|
前端开发 UED
Webpack 中处理 CSS 和图片资源的多 Loader 配置
【10月更文挑战第12天】 处理 CSS 和图片资源是 Webpack 配置中的重要部分。通过合理选择和配置多个 Loader,可以实现对这些资源的精细处理和优化,提升项目的性能和用户体验。在实际应用中,需要不断探索和实践,根据项目的具体情况进行灵活调整和优化,以达到最佳的处理效果。通过对 Webpack 中多 Loader 处理 CSS 和图片资源的深入了解和掌握,你将能够更好地应对各种复杂的资源处理需求,为项目的成功构建和运行提供坚实的基础。
61 1
|
2月前
|
前端开发 JavaScript
Webpack 中多个 Loader 的配置
【10月更文挑战第12天】使用多个 Loader 进行配置是 Webpack 中常见的操作,可以实现对各种资源的精细处理和优化。在配置时,需要根据具体需求合理选择和排列 Loader,并注意它们之间的顺序和交互关系。同时,不断了解和掌握新的 Loader 以及它们的特性,有助于更好地发挥 Webpack 的强大功能,提升项目的开发效率和质量。通过深入理解和熟练运用多个 Loader 的配置方法,你将能够更加灵活地处理各种资源,满足项目的多样化需求。
56 2