从dev到prd使用详解

这次给大家带来从dev到prd使用详解,从dev到prd使用的注意事项有哪些,下面就是实战案例,一起来看一下。

本文用于学习新特性和总结开发必用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出的对象

从dev到prd使用详解

如果交换mainFields中的key顺序

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

登录后复制

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

从dev到prd使用详解

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节选

从dev到prd使用详解

打包出来的react_dll.js节选

从dev到prd使用详解

可见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

登录后复制登录后复制

打包速度显著变快

从dev到prd使用详解

打包后的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)

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

webpack中dev-server使用步骤详解

Angular2中如何使用Dom

以上就是从dev到prd使用详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2765570.html

(0)
上一篇 2025年3月8日 10:51:58
下一篇 2025年3月7日 14:30:49

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Angular父组件调用子组件使用案例

    这次给大家带来Angular父组件调用子组件使用案例,使用Angular父组件调用子组件的注意事项有哪些,下面就是实战案例,一起来看一下。 理解组件 组件是一种特殊的指令,使用更简单的配置项来构建基于组件的应用程序架构 这样他能简单地写ap…

    2025年3月8日
    200
  • block使用实战案例详解

    这次给大家带来block使用实战案例详解,block使用的注意事项有哪些,下面就是实战案例,一起来看一下。 在安卓中我们经常会使用ListView/GradeView/RecyclerView来实现展示循环数据。那么小程序中怎么到呢。其实很…

    2025年3月8日
    200
  • CDN优化首屏加载方法详解

    这次给大家带来CDN优化首屏加载方法详解,CDN优化首屏加载的注意事项有哪些,下面就是实战案例,一起来看一下。 前言 作为一个网站应用,加载速度是非常重要的。加载速度,一个是程序的合理安排,如以组件按需加载,一个是js、css等资源的异步加…

    编程技术 2025年3月8日
    200
  • js存储键值实例详解

    这次给大家带来js存储键值实例详解,js存储键值使用的注意事项有哪些,下面就是实战案例,一起来看一下。 前端有时候需要存储键值对,需要主要的一点是键必须为字符串,重要的再次说明,键需要为字符串。 重点内容 var map={ key1:’a…

    编程技术 2025年3月8日
    200
  • webpack4.0打包优化步骤详解

    这次给大家带来webpack4.0打包优化步骤详解,webpack4.0打包优化的注意事项有哪些,下面就是实战案例,一起来看一下。 webapck4 新特性介绍-参考资料 当前依赖包的版本   1.优化loader配置  1.1 缩小文件匹…

    2025年3月8日 编程技术
    200
  • created方法使用案例详解

    这次给大家带来created方法使用案例详解,created方法使用的注意事项有哪些,下面就是实战案例,一起来看一下。 实例生命周期 每个 Vue 实例在被创建之前都要经过一系列的初始化过程。例如,实例需要配置数据观测(data obser…

    2025年3月8日 编程技术
    200
  • Vue导出excel表格实例详解

    这次给大家带来Vue导出excel表格实例详解,Vue导出excel表格的注意事项有哪些,下面就是实战案例,一起来看一下。 引言: 最近使用vue在做一个后台系统,技术栈 vue + iView ,在页面中生成表格后, iView可以实现表…

    编程技术 2025年3月8日
    200
  • diff算法如何使用

    这次给大家带来diff算法如何使用,diff算法使用的注意事项有哪些,下面就是实战案例,一起来看一下。 虚拟dom diff算法首先要明确一个概念就是diff的对象是虚拟dom,更新真实dom则是diff算法的结果 Vnode基类 cons…

    编程技术 2025年3月8日
    200
  • vue全局组件与局部组件使用案例分析详解

    这次给大家带来vue全局组件与局部组件使用案例分析详解,vue全局组件与局部组件使用案例使用的注意事项有哪些,下面就是实战案例,一起来看一下。 main.js入口文件的一些常用配置, 在入口文件上定义的public.vue为全局组件,在这里…

    编程技术 2025年3月8日
    200
  • Angular服务端渲染方法详解

    这次给大家带来Angular服务端渲染方法详解,Angular服务端渲染的注意事项有哪些,下面就是实战案例,一起来看一下。 Angular Universal Angular在服务端渲染方面提供一套前后端同构解决方案,它就是Angular …

    2025年3月8日 编程技术
    200

发表回复

登录后才能评论