Webpack入门笔记(一)

Webpack入门笔记

webpack是什么:

入门之前首先我们要知道Webpack是什么:

本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle

也就是说,webpack会分析你的项目结构,找到javascript模块以及其他的一些浏览器不能直接运行的拓展语言(typescript等)并将其转换和打包。

在这里插入图片描述

webpack怎么用:

  1. 首先第一步建立好项目文件夹

  2. 第一次使用webpack需要安装下载

$ cnpm install webpack -g
$ npm install webpack-cli -g

使用webpack还需要webpack-cli的支持

  1. 创建package.json文件
$ npm init
  1. 在本项目中安装webpack作为依赖包
$ npm install --save-dev webpack
  1. 配置package.json
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev":"webpack --mode development",
    "build":"webpack --mode production",
  }
  1. 配置webpack.config.js
module.exports = {
    entry:  __dirname + "/app/main.js",//唯一入口文件
    output: {
        path: __dirname + "/public",//打包后的文件存放的地方
        filename: "bundle.js"//打包后输出文件的文件名
    },
    mode:'development'//设置mode
}
  1. 命令行使用webpack就可以了
$ webpack
//或者
$ webpack main.js bundle.js

ps. 配置package.json的时候也可以配置成如下样子

  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev":"webpack --mode development",
    "build":"webpack --mode production",
    "start":"webpack"
  }

这样可以直接 $npm start启动

webpack更强大的用法

webpack.config.js配置

首先看一下webpack.config.js这个配置文件可以做什么

var webpack = require('webpack');
var commonsPlugin = new webpack.optimize.CommonsChunkPlugin('common.js');

module.exports = {
    //插件项
    plugins: [BannerPlugin],//这个插件用于在文件头部输出一些注释信息。
    //页面入口文件配置
    entry: {
        page1: "./page1",
        //支持数组形式,将加载数组中的所有模块,但以最后一个模块作为输出
        page2: ["./entry1", "./entry2"]
    },
    //入口文件输出配置
    output: {
        path: 'dist/js/page',
        filename: '[name].bundle.js'
    },
    //加载器设置
    module: {
      rules: [
        {
          test: /\.css$/,
          use: [
            { loader: "style-loader" },
            { loader: "css-loader" }
          ]
        }
      ]
    }
    //其它解决方案配置
    resolve: {
        //查找module的话从这里开始查找
        root: 'E:/github/flux-example/src', //绝对路径
        //自动扩展文件后缀名,意味着我们require模块可以省略不写后缀名
        extensions: ['', '.js', '.json', '.scss'],
        //模块别名定义,方便后续直接引用别名,无须多写长长的地址
        alias: {
            AppStore : 'js/stores/AppStores.js',//后续直接 require('AppStore') 即可
            ActionType : 'js/actions/ActionType.js',
            AppAction : 'js/actions/AppAction.js'
        }
    }
};
webpack运行

webpack的运行也有一些参数可供选择

$ webpack --display-error-details //方便出错时能查阅更详尽的信息

$ webpack --config XXX.js   //使用另一份配置文件(比如webpack.config2.js)来打包

$ webpack --watch   //监听变动并自动打包

$ webpack -p    //压缩混淆脚本,这个非常非常重要!

$ webpack -d    //生成map映射文件,告知哪些模块被最终打包到哪里了
页面和脚本怎么使用:
  1. HTML

可以直接在页面引入webpack最终生成的页面脚本即可

<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Webpack Sample Project</title>
</head>
<body>
<div id='root'>
</div>
<script src="bundle.js"></script>
</body>
</html>
  1. JS

各脚本模块可以直接使用commonJS来书写,并可以直接引入未经编译的模块(之后在webpack.config.js里配置好了对应的加载器)

require('lodash') // 从模块目录查找
require('./file') // 按相对路径查找

//例如
require('../../css/reset.scss'); //加载初始化样式
require('../../css/allComponent.scss'); //加载组件样式
var React = require('react');
var AppWrap = require('../component/AppWrap'); //加载组件
Loader

webpack本身只能处理javascript模块,如果要处理其他类型的文件,就需要使用loader进行转换。

所以如果我们需要添加css文件,就需要css-loader和style-loader,他们做两件不同的事情,css-loader会遍历 CSS 文件,然后找到 url() 表达式然后处理他们,style-loader 会把原来的 CSS 代码插入页面中的一个 style 标签中。

//需要在webpack.config.js中加入这两个加载器(当然也需要提前下载好)

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

//在main.js中加入要加载的css文件
require("./style.css");

或者也可以只修改main.js

require("!style-loader!css-loader!./style.css");

或者不加入前缀但是更改命令的参数

require("./style.css");
$ webpack main.js bundle.js --module-bind 'css=style-loader!css-loader'

但是后两种方法都各自有各自的麻烦,所以还是推荐使用第一个方法来处理。

插件

插件在 webpack 的配置信息 plugins 选项中指定,用于完成一些 loader 不能完成的工作。

例如安装内置的BannerPlugin插件,用于在文件头部输出一些注释信息。

例如我们更改webpack.config.js

    //插件项
    plugins:[
        new webpack.BannerPlugin('!webpack!第一个!实例')
    ],

然后运行,运行之后打开bundle.js就有我们想要的注释信息了

/*! !webpack!第一个!实例 */
查找依赖

使用命令 $ webpack --display-error-details查看查找过程。

Hash: ea706e67bbe47ba7608a
Version: webpack 4.28.4
Time: 269ms
Built at: 2019-01-20 15:08:08
    Asset      Size  Chunks             Chunk Names
bundle.js  24.4 KiB    main  [emitted]  main
Entrypoint main = bundle.js
[./app/Greeter.js] 171 bytes {main} [built]
[./app/main.js] 164 bytes {main} [built]
[./app/style.css] 1.13 KiB {main} [built]
[./node_modules/_css-loader@2.1.0@css-loader/dist/cjs.js!./app/style.css] 195 bytes {main} [built]
    + 3 hidden modules

故意出个错误看一下,在main.js中加入一句require("./c");

Hash: ac03028a39e7567fa62a
Version: webpack 4.28.4
Time: 269ms
Built at: 2019-01-20 15:10:15
    Asset      Size  Chunks             Chunk Names
bundle.js  24.5 KiB    main  [emitted]  main
Entrypoint main = bundle.js
[./app/Greeter.js] 171 bytes {main} [built]
[./app/main.js] 194 bytes {main} [built]
[./app/style.css] 1.13 KiB {main} [built]
[./node_modules/_css-loader@2.1.0@css-loader/dist/cjs.js!./app/style.css] 195 bytes {main} [built]
    + 3 hidden modules

ERROR in ./app/main.js
Module not found: Error: Can't resolve './c' in 'D:\A-WebStormCode\webpackOne\app'
resolve './c' in 'D:\A-WebStormCode\webpackOne\app'
  using description file: D:\A-WebStormCode\webpackOne\package.json (relative path: ./app)
    Field 'browser' doesn't contain a valid alias configuration
    using description file: D:\A-WebStormCode\webpackOne\package.json (relative path: ./app/c)
      no extension
        Field 'browser' doesn't contain a valid alias configuration
        D:\A-WebStormCode\webpackOne\app\c doesn't exist
      .js
        Field 'browser' doesn't contain a valid alias configuration
        D:\A-WebStormCode\webpackOne\app\c.js doesn't exist
      .json
        Field 'browser' doesn't contain a valid alias configuration
        D:\A-WebStormCode\webpackOne\app\c.json doesn't exist
      .scss
        Field 'browser' doesn't contain a valid alias configuration
        D:\A-WebStormCode\webpackOne\app\c.scss doesn't exist
      as directory
        D:\A-WebStormCode\webpackOne\app\c doesn't exist
[D:\A-WebStormCode\webpackOne\app\c]
[D:\A-WebStormCode\webpackOne\app\c.js]
[D:\A-WebStormCode\webpackOne\app\c.json]
[D:\A-WebStormCode\webpackOne\app\c.scss]
 @ ./app/main.js 7:0-14

通过这个就可以大致看出来webpack是怎么进行查找的。

这个笔记大概到这里,需要更详细的用法还是跟着webpack的中文文档。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值