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最基本的配置,希望继续学习下去之后,能有更多的东西记录与分享。如有错漏,恳请指出。您的批评和指正是我前进路上的一大动力。


相关文章
|
7天前
|
前端开发
umi webpack配置图片资源转base64
umi webpack配置图片资源转base64
|
19天前
|
前端开发 JavaScript 开发者
Angular与Webpack协同优化:打造生产级别的打包配置——详解从基础设置到高级代码拆分和插件使用
【8月更文挑战第31天】在现代前端开发中,优化应用性能和加载时间至关重要,尤其是对于使用Angular框架的项目。本文通过代码示例详细展示了如何配置Webpack,以实现生产级别的打包优化。从基础配置到生产环境设置、代码拆分,再到使用加载器与插件,每个步骤都旨在提升应用效率,确保快速加载和稳定运行。通过这些配置,开发者能更好地控制资源打包,充分发挥Webpack的强大功能。
26 0
|
21天前
|
JavaScript 测试技术
在不同 webpack 版本的 Vue 项目中配置 Storybook
在不同 webpack 版本的 Vue 项目中配置 Storybook
|
2月前
|
JSON 前端开发 JavaScript
前端工程化:Webpack配置全攻略
【7月更文挑战第14天】
49 6
|
2月前
|
JSON 缓存 前端开发
前端工程化:Webpack配置全攻略
【7月更文挑战第18天】
36 1
|
3月前
|
缓存 JavaScript
webpack配置中的3种hash值
webpack配置中的3种hash值
|
3月前
|
缓存 前端开发 JavaScript
Webpack作为模块打包器,为前端项目提供了高度灵活和可配置的构建流程
【6月更文挑战第12天】本文探讨了优化TypeScript与Webpack构建性能的策略。理解Webpack的解析、构建和生成阶段是关键。优化包括:调整tsconfig.json(如关闭不必要的类型检查)和webpack.config.js选项,启用Webpack缓存,实现增量构建,代码拆分和懒加载。这些方法能提升构建速度,提高开发效率。
52 3
|
2月前
|
JavaScript
vue 配置【详解】 vue.config.js ( 含 webpack 配置 )
vue 配置【详解】 vue.config.js ( 含 webpack 配置 )
40 0
|
4月前
|
前端开发
【专栏】`webpack` 的 `DefinePlugin` 插件用于在编译时动态定义全局变量,实现环境变量差异化、配置参数动态化和条件编译
【4月更文挑战第29天】`webpack` 的 `DefinePlugin` 插件用于在编译时动态定义全局变量,实现环境变量差异化、配置参数动态化和条件编译。通过配置键值对,如 `ENV: JSON.stringify(process.env.NODE_ENV)`,可以在代码中根据环境执行相应逻辑。实际应用包括动态加载资源、动态配置接口地址和条件编译优化代码。注意变量定义的合法性和避免覆盖,解决变量未定义或值错误的问题,以提升开发效率和项目质量。
226 3
|
JavaScript 开发工具 前端开发
webpack配置的基本介绍
https://github.com/DDFE/DDFE-blog/issues/10   全局安装 webpack :(当前笔记版本: webpack  3.10.0 , mac环境) 1. npm install webpack -g 2.
1126 0