20190510 webpack基础

webpack

现代JavaScript应用程序静态模块打包工具。

webpack处理应用程序的时候会在内部构建一个依赖图,映射项目所需的每个模块,生成一个或者多个bundle

核心概念:入口、输出、loader、plugin、模式、

入口 entry

作用:告诉 webpack 应该使用哪个模块作为内部 依赖图 的开始起点。

  • 单入口简单语法

    module.exports = {
      entry: "./path/to/my/entry/file.js"
    };
    
  • 多入口对象语法

    module.exports = {
      entry: {
        app: "./src/app.js",
        adminApp: "./src/adminApp.js"
      }
    };
    

输出 output

作用:告诉 webpack 在哪里输出他所创建的 bundle。

默认值:./dist/main.js

  • 单个入口输出文件

    module.exports = {
      output: {
        filename: "bundle.js",
        path: path.resolve(__dirname, "dist")
      }
    };
    
  • 多个入口起点输出文件名称使用 占位符

    module.exports = {
      output: {
        filename: "[name].js",
        path: path.resolve(__dirname, "dist")
      }
    };
    

    作用: 确保每个文件具有唯一的名称

补充
  • path.resolve(__dirname, 'dist')

    • path 是 node 中的内置对象
    • path.resolve 是将路径或者路径片段序列解析成绝对路径
    • __dirname 指的是当前模块文件所在的完整路径
  • 缓存 hash

loader

作用:转换其他类型的模块,让 webpack 能够去处理除了 JavaScript 和 JSON 类型的其他类型文件。

比如:css、less、图片、字体、XML 等文件

方法:在 module.rules 中配置数组,数组每一项都有 testuse

module.exports = {
  module: {
    rules: [{ test: /\.(jpg|png|gif|svg)$/, use: ["file-loader"] }]
  }
};

原理:告诉 webpack 当碰到引入’.jpg’ 文件类型的时候,先使用 file-loader 转换一下。

plugin 插件

作用:执行更广泛的任务;包括:打包优化、资源管理、注入环境变量等。

举例:

module.exports = {
  plugins: [new HtmlWebpackPlugin({ template: "./src/index.html" })]
};

使用 html-webpack-plugin 这个插件为应用程序生成一个 HTML 文件,并且自动注入所有的 bundle

mode 模式

作用:通过选择 development、production、none 来启用 webpack 在相应的环境下的内置的优化

默认值:production

如何解决webpack加载慢的问题

加载缓慢是指用户用户访问网站后长时间无法显示主要内容和页面

  • 加载请求并发

    通过插件CommonsChunkPlugin将各个页面用到的模块打包到一个综合的文件Vendor.js中,去降低多次建立连接与并发的问题。

  • 启用缓存

    原因:用户每一次打开网站,都会从服务器重复的加载相同的资源文件。这样显然也是白白浪费带宽了。

    但是开启缓存后,有可能我们更新了代码,但是因为缓存原因,无法同步到新的代码,

    因此,我们需要使用 webpack 的 hash 标签来为资源文件进行命名,当文件内容发生改变的时候hash值也会发生变化,就可以更新版本了。

  • 按需加载

    以页面为单位,进行代码分隔,然后访问到哪个路由时再单独加载。

如何优化webpack的编译速度

  • 使用插件整合第三方类库

    因为如果不整合的话,每次编译webpack都会重新处理页面中模块的引用关系
    所以我们通过CommonsChunkPlugin插件去整合类库。

  • 对第三方类库进行预编译

    因为,通常类库的代码是不经常变动的,但是webpack每次编译都会去处理这些类库,导致效率很低
    所以,我们可以通过插件DllPlugin对类库进行预编译,在需要的时候直接引用编译的结果就好了。

  • 开发环境下关闭不必要的Plugins

    比如说:对JS进行压缩的 或者 对CSS进行提取的uglifyjs-webpack-pluginextract-text-webpack-plugin

  • 生产环境下关闭source-map源映射

    作用:能在编译后的代码中迅速找到对应的源代码的位置

    他非常影响代码的编译速度,在生产环境中,我们没有必要在线上追踪调试错误

    所以,生产环境的source-map是没必要开启的

gulp 和 webpack 的区别

gulp

  1. 自动化构建工具,比如:压缩 css、js、编译 less
  2. gulp 的处理任务需要自己去写

webpack

  1. 打包工具,对模块打包,预编译模块,处理模块之间的依赖
  2. 现成的解决方案,只需要在 webpack.config.js 配置好就可以了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值