【前端】webpack

一 Webpack概念

静态模块打包器,当Webpack处理程序时,它会构建一个包含应用程序所有模块的依赖关系图,然后将它们打包成一个或多个bundle。
从Webpack4.0开始,我们可以不引入配置文件,但它依旧是高度可配置的。
webpack处理文件的过程可以分为两个维度:文件间的关系和文件的内容。文件间的关系处理,主要是通过文件和模块标记方法来实现;文件内容的处理主要通过loaders和plugins来处理。

二 入口

入口(一个或多个)即依赖关系图的开始,webpack会找到和其直接或者间接依赖的,输出到bundles文件中。

1.单个入口简写语法(灵活性差)
entry: string|Array<string>

例如:

module.exports = {
  entry: './path/to/my/entry/file.js'
};
  • 暂时还不理解下面的:
    当你向 entry 传入一个数组时会发生什么?向 entry 属性传入「文件路径(file path)数组」将创建“多个主入口(multi-main entry)”。在你想要多个依赖文件一起注入,并且将它们的依赖导向(graph)到一个“chunk”时,传入数组的方式就很有用。
2. 对象语法(扩展性好)
entry: {[entryChunkName: string]: string|Array<string>}
例1 分离 应用程序(app) 和 第三方库(vendor) 入口
const config = {
  entry: {
    app: './src/app.js',
    vendors: './src/vendors.js'
  }
};
  • 不理解:
    这是什么?从表面上看,这告诉我们 webpack 从 app.js 和 vendors.js 开始创建依赖图(dependency graph)。这些依赖图是彼此完全分离、互相独立的(每个 bundle 中都有一个 webpack 引导(bootstrap))。这种方式比较常见于,只有一个入口起点(不包括 vendor)的单页应用程序(single page application)中。
    为什么?此设置允许你使用 CommonsChunkPlugin 从「应用程序 bundle」中提取 vendor 引用(vendor reference) 到 vendor bundle,并把引用 vendor 的部分替换为 webpack_require() 调用。如果应用程序 bundle 中没有 vendor 代码,那么你可以在 webpack 中实现被称为长效缓存的通用模式。
例2 多页面应用程序
const config = {
  entry: {
    pageOne: './src/pageOne/index.js',
    pageTwo: './src/pageTwo/index.js',
    pageThree: './src/pageThree/index.js'
  }
};
  • 不理解:
    这是什么?我们告诉 webpack 需要 3 个独立分离的依赖图(如上面的示例)。
    为什么?在多页应用中,(译注:每当页面跳转时)服务器将为你获取一个新的 HTML 文档。页面重新加载新文档,并且资源被重新下载。然而,这给了我们特殊的机会去做很多事:
    使用 CommonsChunkPlugin 为每个页面间的应用程序共享代码创建 bundle。由于入口起点增多,多页应用能够复用入口起点之间的大量代码/模块,从而可以极大地从这些技术中受益。
    根据经验:每个 HTML 文档只使用一个入口起点。
三 输出(output)

配置 output 选项可以控制 webpack 如何向硬盘写入编译文件,输出只有一个。包含以下两点:
⑴filename:文件名
⑵path:绝对路径
例子1:

const config = {
  output: {
    filename: 'bundle.js',
    path: '/home/proj/public/assets'
  }
};
module.exports = config;

此配置将一个单独的 bundle.js 文件输出到 /home/proj/public/assets 目录中。
例子2:
如果配置创建了多个单独的 “chunk”(例如,使用多个入口起点或使用像 CommonsChunkPlugin 这样的插件),则应该使用占位符(substitutions)来确保每个文件具有唯一的名称。

{
  entry: {
    app: './src/app.js',
    search: './src/search.js'
  },
  output: {
    filename: '[name].js',
    path: __dirname + '/dist'
  }
}
四 Chunk

chunk是一个很重要的概念,所以这里单独拿出来说明一下。
就是打包后的代码块的意思,chunkname就是打包后代码的名字。

五 模式(mode)

告诉package使用相应的模式优化。
待研究

六 loader

webpack只能打包js文件。因此像css文件等就需要loader将资源转化,加载进来。
我们先需要通过命令行安装loader:

npm install --save-dev css-loader
npm install --save-dev ts-loader

然后通过配置文件的方式对每个 .css 使用 css-loader,以及对所有 .ts 文件使用 ts-loader:

module.exports = {
  module: {
    rules: [
      { test: /\.css$/, use: 'css-loader' },
      { test: /\.ts$/, use: 'ts-loader' }
    ]
  }
};
七 插件

想像一下,你使用 webpack 将你的文件 bundle 在一起,然后你发现到 bundle 后的结果是 900KB。这是个问题,但是你可以通过 minify 你的 bundle 文件来做改善。要做到这一点,可以使用UglifyJsPlugin plugin。

// webpack.config.js
var path = require('path')
var webpack = require('webpack')

module.exports = {
  entry: ['./src/index'],
  output: {
    path: path.join(__dirname, 'dist'),
    filename: 'bundle.js'
  },

  plugins: [
    new webpack.optimize.UglifyJsPlugin({
      compressor: {
        warnings: false,
      },
    })
  ]
}

常用插件

八 targets

webpack可以为js的各种不同的宿主环境提供编译功能,为了能正确的进行编译,就需要开发人员在配置里面正确的进行配置。

默认情况下,target的值是web,也就是为类浏览器的环境提供编译。
target的具体常用值可以去网上查。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值