资讯专栏INFORMATION COLUMN

webpack v4 从dev到prd

NicolasHe / 1681人阅读

摘要:新版中将命令行工具拆分到多带带的仓库中,所以需要额外安装。转换文件的匹配正则尽量减少文件解析用配置文件解析路径只转换或者编译目录下的文件不要解析当从包中导入模块时例如,引入下的库,此选项将决定在中使用哪个字段导入模块。

目录

概述

Big changes

加载loader方法总结

开发必备的loader&plugins

优化向prd进发

未完待续

概述
本月迎来了 v4 正式版的发布,本文用于学习新特性和总结开发必用plugin & loader,从dev到prd,走你~
Big changes

Environment

Node.js 4 is no longer supported. Source Code was upgraded to a higher ecmascript version.

Usage

You have to choose (mode or --mode) between two modes now: production or development

本次新版本中引入了 mode 配置项,开发者可在 none,development(开发 ) 以及 production(产品)三种模式间选择。该配置项缺省情况下默认使用 production 模式。

development 模式给你极致的开发体验,包含浏览器调试相关工具,极快的增量编译,丰富全面的报错信息...

production 模式则包含大量发版优化,代码压缩,丝般润滑的运行时优化,开发相关代码的排除,易用,etc.

none 不使用预设,等于老版本中全部自己配置的原始状态。

eg:

webpack --mode development

Usage

Some Plugin options are now validated

CLI has been move to webpack-cli, you need to install webpack-cli to use the CLI

The ProgressPlugin (--progress) now displays plugin names

At least for plugins migrated to the new plugin system

新版中将 webpack 命令行工具拆分到多带带的仓库中,所以需要额外安装 webpack-cli。
npm init -y //初始化项目
npm install webpack webpack-cli -D //安装webpack webpack-cli 依赖
npx webpack --mode development // npx可以直接运行node_modules/.bin目录下面的命令

或者通过配置package.json的script build
"scripts": {
    "build": "webpack --mode development",
},
加载loader方法总结

use

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

css-loader用来解析处理CSS文件中的url路径,

要把CSS文件变成一个模块
多个loader是有顺序要求的,从右往左写,因为转换的时候是从右往左转换

此插件先用css-loader处理一下css文件,再用style-loader把CSS文件变成style标签插入head中

loader

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

use+loader

module: {
    rules:[
        {
            test: /.css$/,
            use:[
                { loader:"style-loader"},
                { 
                    loader: "css-loader",
                    options: {sourceMap: true}
                }
            ]
        }
    ]
}
这三种loader的写法,最后打包的结果相同

loader中的options配置项可以用"?"跟在加载器后面

eg:

{  
    test: /.jpeg$/,  
    use: "url-loader?limit=1024&name=[path][name].[ext]&outputPath=img/&publicPath=output/",  
}

为以下配置的简写

{  
    test: /.jpeg$/,  
    use: {
        loader:"url-loader",
        options:{
            limit:1024,
            name:[path][name].[ext],
            outputPath:img/
            publicPath:output/"
        }
    }
}
开发必备的loader&plugins

css-loader

babel-loader

讲ES6代码转换为ES5
{
    test: /.js/,
    use: {
        loader: "babel-loader",
        query: {
            presets: ["env", "stage-0", "react"]
        }
    }
},

babel-loader的预设可以添加在query中,也可以在项目根目录添加 .babelrc 文件

.babelrc

{
    "presets": [
        "env",
        "stage-0",
        "react"
    ]
}

html-webpack-plugin

插件的基本作用就是生成html文件。原理很简单:

将 webpack中entry配置的相关入口thunk  和  extract-text-webpack-plugin抽取的css样式   插入到该插件提供的template或者templateContent配置项指定的内容基础上生成一个html文件,具体插入方式是将样式link插入到head元素中,script插入到head或者body中。
const HtmlWebpackPlugin = require("html-webpack-plugin");

new HtmlWebpackPlugin({
    template: "./src/index.html",//指定产的HTML模板
    filename: `index.html`,//产出的HTML文件名
    title: "index",
    hash: true,// 会在引入的js里加入查询字符串避免缓存,
    minify: {
        removeAttributeQuotes: true
    }
}),

可以用 cnpm search html-webpack-plugin 查找想用loader的用法

less-loader sass-loader

优化向prd进发

提取公共的css代码

它会将所有的入口 chunk(entry chunks)中引用的 *.css,移动到独立分离的 CSS 文件。因此,你的样式将不再内嵌到 JS bundle 中,而是会放到一个多带带的 CSS 文件(即 styles.css)当中。 如果你的样式文件大小较大,这会做更快提前加载,因为 CSS bundle 会跟 JS bundle 并行加载。
npm i extract-text-webpack-plugin@next -D
const ExtractTextWebpackPlugin = require("extract-text-webpack-plugin");
let cssExtract = new ExtractTextWebpackPlugin({
    filename: "css/css.css",
    allChunks: true
});
module:{
    rules:[
        {
            test: /.css$/,//转换文件的匹配正则
            loader: cssExtract.extract({
                use: ["css-loader?minimize"]
            })
        },
    ]
}
plugins:[
    ...... ,
    + cssExtract
]

尽量减少文件解析,用resolve配置文件解析路径,include

rules: {
    test: /.js$/,
    loader:"babel-loader",
    include: path.resolve(__dirname, "src"),//只转换或者编译src 目录 下的文件
    exclude: /node_modules/ //不要解析node_modules
}

resolve.mainFields

WebpackTest
|
|
| - src
|   | - index.js
|
| - lib
|   | - fetch
|       |
|       browser.js
|       node.js
|       package.json
|
| - webpack.config.js
当从 npm 包中导入模块时(例如,引入lib下的库),此选项将决定在 package.json 中使用哪个字段导入模块。根据 webpack 配置中指定的 target 不同,默认值也会有所不同。

package.json

lib文件夹下的package.json中配置相对应模块的key

{
  "name": "fetch",
  "version": "1.0.0",
  "description": "",
  "node": "./node.js",
  "browser": "./browser.js",
  "scripts": {
    "test": "echo "Error: no test specified" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

webpack.config.js

在resolve解析对象中,加入lib的路径
resolve: {
    extensions: [".js", ".json"],
    mainFields: ["main", "browser", "node"],
    modules: [path.resolve("node_modules"), path.resolve("lib")]
}

index.js

这样在index.js中引用第三方库时,会去查找modules下的路径中是否配置了所需的文件,知道在package.json中找到mainFields中的key对应文件,停止。
let fetch = require("fetch");
console.log(fetch);

打包后 console.log出的对象

如果交换mainFields中的key顺序

mainFields: ["main", "node","browser"]

打包后 console.log出的对象,因为找到了key=node对应的文件就停止了查找

DllReferencePlugin

这个插件是在 webpack 主配置文件中设置的, 这个插件把只有 dll 的 bundle(们)(dll-only-bundle(s)) 引用到需要的预编译的依赖。

新建webpack.react.config.js

const path = require("path");
const webpack = require("webpack")
module.exports = {
    entry: {
        react: ["react", "react-dom"]
    },
    output: {
        path: path.join(__dirname, "dist"),// 输出动态连接库的文件名称
        filename: "[name]_dll.js",
        library: "_dll_[name]"//全局变量的名字,其它会从此变量上获取到里面的模块
    },
    // manifest 表示一个描述文件
    plugins: [
        new webpack.DllPlugin({
            name: "_dll_[name]",
            path: path.join(__dirname, "dist", "manifest.json")//最后打包出来的文件目录和名字
        })
    ]
}
在entry入口写入要打包成dll的文件,这里把体积较大的react和react-dom打包

output中的关键是library的全局变量名,下文详细说明dll&manifest工作原理

打包dll文件

webpack --config webpack.react.config.js --mode development

打包出来的manifest.json节选

打包出来的react_dll.js节选

可见manifest.json中的 name值就是

output:{
    library:_dll_react
}

manifest.json就是借书证,_dll_react就像图书馆书籍的条形码,为我们最终找到filename为react_dll.js的参考书

使用“参考书”

在webpack.config.js中加入“借书证”

new webpack.DllReferencePlugin({
    manifest: path.join(__dirname, "dist", "manifest.json")
})

再运行

webpack --mode development

打包速度显著变快

打包后的main.js中,react,react-dom.js也打包进来了,成功~

import React from "react";
//import ReactDOM from "react-dom";
 (function(module, exports, __webpack_require__) {

"use strict";
eval("

//import name from "./base";
//import React from "react";
//import ReactDOM from "react-dom";
//import ajax from "ajax";
//let result = ajax("/ajax");

//ReactDOM.render(

{result}

, document.getElementById("root")); // fetch fetch.js fetch.json fetch文件夹 //let fetch = require("fetch"); //console.log(fetch); //let get = require("../dist/bundle.js"); //get.getName(); console.log("hello"); var name = "zfpx"; console.log(name); if (true) { var s = "ssssssssssssssssssssssss"; console.log(s); console.log(s); console.log(s); console.log(s); } //# sourceURL=webpack:///./src/index.js?"); /***/ }) /******/ });
未完待续

webpack.ProvidePlugin

拷贝静态资源

压缩css(npm i -D purifycss-webpack purify-css)

觉得好玩就关注一下~欢迎大家收藏写评论~~~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/93832.html

相关文章

  • webpack替代fekit的折腾小记

    摘要:添加依赖到如何使用依赖当你再兴建一个文件的时候,就不需要一个个插件安装了,将文件复制到当前文件下,并输入,即通过里的依赖关系,自动把依赖安装好了。第四步新建配置文件默认的配置文件在项目目录下为。 WilsonLius blog 首发地址 前言 早就想尝试webpack的,却一直没有时间,恰逢周末,又时值最近在公司实习的时候尝到用fekit做模块化的构建工具的爽。所以就开始以公司的项目结...

    curried 评论0 收藏0
  • Reactjs、redux的入门放弃、删库跑路示例

    摘要:我的入门到放弃之路最近看到很多相关的问题跟讨论,越来越多的小伙伴喜欢这个框架了,同时也在看到了有些入门的小伙伴遇到了各种各样的问题,本人也是框架使用都一枚,公司是腾讯阿里平安三巨头合资的一家公司,分别上海深圳杭州北京广州等多个分部,前端人员 showImg(https://segmentfault.com/img/bVbhonB?w=1278&h=722); 我的react入门到放弃之...

    Miracle 评论0 收藏0
  • 基于webpack4的VUE多页脚手架

    摘要:另外备注一部分参数的说明折叠有助于文档树中文本节点的空白区域对进行压缩默认默认按照不同文件的依赖关系来排序。敲黑板讲重点的当然目前这部分的文档在官网还不是很全,所以这里我们参考了印记中文的说明文档,指优化模块。 链接 写在前面 为什么要自己手写一个脚手架? 如何去思考遇到的问题? 正文 链接 原文链接 github whale-vue ——写在前面 1、为什么要自己手写...

    张金宝 评论0 收藏0
  • webpack 项目构建:(三)开发环境——本地服务器搭建

    摘要:上一章我们了解了的编译环境搭建项目构建二编译环境搭建这一章我们会结合的,介绍本地测试服务器的搭建过程。三开发环境有一些特性是专门用于开发环境的,可以帮助我们搭建一个更好的开发环境。我们可以通过配合使用来搭建本地服务。 注:以下教程均在 windows 环境实现,使用其他操作系统的同学实践过程可能会有些出入。   上一章我们了解了 webpack 的 ES6 编译环境搭建:webpack...

    tolerious 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<