webpack --- 发布环境的配置 代码压缩 代码分类

说明

  • 源代码
  • 本篇主要对发布环境的配置说明
  • 前面2点是对webpack的一个复习.
  • 第3点开始,逐步配置部署代码

1. Webpack发布的策略

2.1 在实际开发中,一般会有两套方案:

  • 开发期间的项目:包含了测试文件、测试数据、开发工具、测试工具等相关配置,有利于项目的开发和测试,但是这些文件仅用于开发,发布项目的时候需要删除
  • 部署期间的项目,剔除了那些客户用不到的测试数据、测试工具和文件,比较纯净,减少了项目发布后的体积,有利于开发和部署

2.2 生产环境的配置文件

  • 为了满足我们的发布策略,需要新建一个配置文件,命名为webpack.publish.config.js,将webpack.config.js的配置拷贝过去,剔除一些开发配置项即可.

  • devSever节点删掉:

  devServer: {hot: true,open: true,port: 4321}
  • plugins节点下的热更新插件删掉:
new webpack.HotModuleRupluComuntPlugin()

2. Webpack从0开始使用

2.1 项目初始化

: 使用的node版本是 12.10.0

2.1.1 新建项目(文件夹)webpack-senior

2.1.2 进入webpack-senior

新建下面三个:

  • 打包之后的文件夹: dist
  • 项目的源代码: src
  • webpack的配置文件: webpack.config.js

2.1.3 初始化项目

  • npm init -y
  • 使用yarn安装 jquery: yarn add jquery (等同于 npm i -D jquery)

2.1.4 src的初始化

  • 在其中新建如下文件和内容:
  • src/index.js
     <html><body><ul><li>这是第1个li</li><li>这是第2个li</li><li>这是第3个li</li><li>这是第4个li</li></ul></body></html>
    
    • src/main.js
    import $ from 'jquery'
    $(function(){$('li:odd').css('backgroundColor','pink');$('li:even').css('backgroundColor','marron');
    })();
    

2.1.5 配置文件的编写

  • 上面完成了简单的页面和js对页面的操作,下面写Webpack的配置文件(webpack使用配置文件对项目进行打包构建)

  • webpack.config.js

     const path = require('path');module.exports = {entry: path.join(__dirname, './src/main.js'),output: {path: path.join(__dirname, './dist'),filename: 'bundle.js'}}
    
  • 以上代码指明了webpack的入口和打包文件,下面需要装2个插件来使index.html和main.js在内存中生成:
  1. yarn add webpack --dev(webpack是在开发环境中进行的,因此需要在npm中使用-S,在yarn中则变为 --dev)
  2. yarn add webpack-dev-server html-webpack-plugin --dev: 安装在内存中生成index.html和main.js的插件,改写webpack.config.js如下:
    const path = require('path');const htmlWebpackPlugin = require('html-webpack-plugin');module.exports = {entry: path.join(__dirname, './src/main.js'),output: {path: path.join(__dirname, './dist'),filename: 'bundle.js'},plugin: [new htmlWebpackPlugin({template: path.join(__dirname, './src/index.html'),filename: 'index.html'})]}
  • 上面已经将html页面放到了内存中,接下来配置启动命令:package.json
   {"scripts": {"dev": "webpack-dev-server --open --port 3000 hot"}}

2.1.6 小检测点

对上面过程进行说明:

  • 从启动命令npm run dev说起
  • 当在命令行,输入 npm run dev
  • 工具: webpack-cli(安装在开发环境, yarn add webpack-cli --dev),会以命令行启动的目录作为当前目录,去寻找package.json文件
  • 找到package.json文件后,会寻找"scripts"
  • 找到scripts对象后,进而找到"dev"
  • 然后运行命令webpack-dev-server --open --port 3000 --hot
  • webpack-dev-server:
    1. 每次写完代码手动调用webpack去打包代码太麻烦,因此使用 webpack-dev-server来进行自动打包构建
    2. 会根据package.json中output的配置,生产一个内存中的main.js文件.

2.2 webpack中loader的配置

webpack默认只能解析.js.json文件,若想解析其他类型的文件,需要配置loader

配置loader解析.scss

  1. 在src目录下新建目录结构/src/css/index.scss
  2. index.scss中写入如下:
html,
body {margin: 0;padding: 0;ul {list-style: none;padding: 0;margin: 0;}li{font-size:12px;line-height: 30px;padding-left: 10px;}.box {width: 500px;height: 230px;background: url('../images/开心.gif');background-size: cover;}
}
  1. /src/index.html中添加如下:
<div class="box"></div>
  1. 在main.js中导入index.scss:
import './css/index.scss';

此时项目肯定启动不了,因为未配置loader的webpack不能解析.scss,下配置:

  • 解析CSS、SCSS、URL加载
  • 安装依赖: yarn add style-loader css-loader sass-loader node-sass url-loader file-loader --dev
  // webpack.config.jsmodule.exports = {module:{rules:[{ test: /\.css$/, use: ['style-loader', 'css-loader'] },{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] },{ test: /\.(png|gif|bump|jpg)$/, use: ['url-loader?limit=5000']}]}}
  • 解析ES6的高级语法
  • 安装依赖: yarn add babel-core babel-loader babel-plugin-transform-runtime babel-preset-env babel-preset-stage-0 --dev
    // webpack.config.jsmodule.exports ={module:{rules:[{ test:/\.js$/, use:'babel-loader', exclude: /node_modules/ }]}}````````js//  .babelrc{"presets": ["env", "stage-0"],"plugins": ["transform-runtime"]}
  • Error: Cannot find module '@babel/core': 查看报错,是因为babel-loader的版本过高,根据提示输入yarn add babel-loader@7 --dev即可
  • Module not found: Error: Can't resolve 'scss-loader' in 'D:\L-rn\HeiMa\webpack-senior':没有找到scss-loader模块,打开package.json可以看到,里面有一个’sass-loader’,将webpack.config.js中的scss改为sass即可.

3. 使用Webpack打包项目

现在假设项目已经开发完毕,并且打算使用webpack将项目进行打包.

3.1 直接在命令行输入webpack命令进行打包

  • 直接打包,生成的项目体积会很大,许多不需要的内容都会被打包在里面

3.2 优化打包

3.2.1 新建一个打包时的webpack配置文件:

  • webpack.pub.config.js

3.2. 2 新建一个打包指令:

  • package.json
  {"scripts": {"build": "webpack --config webpack.pub.config.js"}}

3.3.3 统一管理打包后的图片

  • 将打包后的所有图片放到dist/images中统一管理
  • 改变webpack.pub.config.js
  module.exports ={module: {rules:[{ test:/\.(png|gif|bump|jpg)$/, use: ['url-loader?limit=5000&name=images/[hash:8]-[name].[ext]']}]}}

3.3.4 清除之前的打包文件

  • 每次打包都删除之前的dist文件
  • 安装插件 yarn add clean-webpack-plugin --dev
  • 配置: webpack.pub.config.js
    const { CleanWebpackPlugin } = require('clean-webpack-plugin');module.exports = {plugins: [new CleanWebpackPlugin()]}
  • TypeError: cleanWebpackPlugin is not a constructor : 规则配置的时候出错,不需要传入参数下面是官网原话,拿出组件时,用到了结构赋值.

    By default, this plugin will remove all files inside webpack`s output.path directory,as well as all unused webpack assets after every successful rebuild

3.3.5 将自己的代码和第三方包分离

  • webpack.pub.config.js
   const webpack = require('webpack');const WebpackPlugin = new webpack.optimize.CommonsChunkPlugin({name:'common',filename: 'common.js'});module.exports = {entry: {app: path.join(__dirname, './src/main.js'),common: ['jquery']},plugins:[WebpackPlugin]}
  • 自动优先加载第三方模块,在加载自己的代码.
     

3.3.6 将所有js文件放到js文件夹下面

  • webpack.pub.config.js
   const WebpackPlugin = new webpack.optimize.CommonsChunkPlugin({name: 'common',-  filename: 'common.js'+  filename: 'js/common.js'});module.exports = {output: {-    filename:'[name].js'+    filename:'js/[name].js'}}

3.3.7 压缩js代码

   // 压缩JS代码const UglifyJsPlugin = new webpack.optimize.UgliJsPlugin({compress:{warnings: false}});// 定义生产环境,进一步压缩代码const DefinePlugin = new webpack.DefinePlugin({'process.env.NODE_ENV': 'production'});module.exports = {plugins:[UglifyJsPlugin,DefinePlugin]}
&nbsp;

3.3.8 压缩HTML代码

  • webpack.config.js
   const HtmlPlugin = new HtmlWebpackPlugin({template: path.join(__dirname, './src/index.html'),filename: 'index.html',minify:{// 合并多余的空格collapseWhitespace: true,// 移除注释removeComments: true,// 移出属性上的双引号removeAttributeQuotes: true}});
  • 更多minify参数: 官方github
     

3.3.9 将css代码从js中抽离出来放在同一个文件夹下

  • 官网
  • yarn add extract-text-webpack-plugin --dev
   const ExtractTextPlugin = require('extract-text-webpack-plugin');module.exports = {module: {rules:[{test: /\.scss$/,use: ExtractTextPlugin.extract({fallback: 'style-loader',use: ['css-loader', 'sass-loader']})}]},plugins: [new ExtractTextPlugin("style.css")]}
  • 报错Module build failed: CssSyntaxError: 注释掉css的配置文件如下
    module.exports = {module: {rules[//      {//        test: /\.css$/,//        use: ExtractTextPlugin.extract({//          fallback: "style-loader",//          use: "css-loader"//        })//     }...]}}

3.3.10 抽离css时候,图片路径问题

  • 我们希望将CSS从js代码中抽出,单独存放在一个css文件夹下面.
  • 如果css中使用到了url属性(如{background: url(path)}),在抽离出来后路径会发生变化.
  • 需要在抽离后,自动添加路径如下:
````git
{test: /\.scss$/,use: ExtractTextPlugin.extract({fallback: 'style-loader',use: ['css-loader', 'sass-loader'],
+   publicPath: '../'})
}
````

3.3.11 压缩css文件

  • yarn add optimize-css-assets-webpack-plugin --dev
    const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');plugins: [new OptimizeCssAssetsPlugin()]
  • TypeError: Cannot read property 'compilation' of undefined: 版本问题: yarn add optimize-css-assets-webpack-plugin@3.2.0 --dev

4.检测点

4.1 webpack是如何提高开发效率的

  • 从文件中打开.html文件时,首先从磁盘上加载该文件的内容到内存中,然后在进行渲染
  • 磁盘和内存的交互,远远没有内存中直接操作快
  • html-webpack-plugin : 会根据给定的模板文件,生成在内存中的主页
  • webpack-dev-server : 会根据配置,生成一个在内存中的主入口函数
  • 优点是把能在内存中操作的部分,都放到内存中操作.缺点比较占用内存.
  • 在开发阶段,可以很方便的使用第三方库,在生产阶段,可以使用一些插件将第三方库和源代码进行分离,并压缩代码

4.2 yarn和npm的命令行在使用的时候有什么区别.

  • 首先理解开发环境生产环境
  • 开发环境: 即开发过程中使用到的依赖,在npm中常常使用-D来将依赖添加到开发环境(“devDependencies”)中
  • 生产环境: 项目部署到服务器上所用到的依赖,在npm中常常使用-S来讲依赖添加到生产环境(“dependencies”)中
  • 在yarn中,使用yarn add默认将包放在生产环境中,即对应npm的 -S
  • 若需要添加到开发环境中,则需要使用yarn add [packagename] --dev

4.3 webpack中loader和plugins的区别

  • 原生的webpack只能理解javascript和json文件,如果遇到如.css或.jsx这类的后缀名,是无法解析的,这个时候就需要用到loader了,而某些loader无法解析的,就用到plugins.
  • loader是在开发过程用到的插件,而plugin贯彻整个开发和项目部署

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250387.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

salesforce lightning零基础学习(三) 表达式的!(绑定表达式)与 #(非绑定表达式)

在salesforce的classic中&#xff0c;我们使用{!expresion}在前台页面展示信息&#xff0c;在lightning中&#xff0c;上一篇我们也提及了&#xff0c;如果展示attribute的值&#xff0c;可以使用{!v.expresion}展示信息。 lightning在component中解析动态值的时候&#xff0c;…

sqlserver学习3---sql函数

一、SQL DML 和 DDL 可以把 SQL 分为两个部分&#xff1a;数据操作语言 (DML) 和 数据定义语言 (DDL)。 SQL (结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。 查询和更新指令构成了 SQL 的 DML 部分&#xff1a; SELECT - 从数据库…

JavaScript --- [学习笔记] 原型模式

说明 接JavaScript — > [学习笔记]观察者模式 & 理解对象 & 工厂模式 & 构造函数模式上一篇构造函数模式创建的实例,不同实例的同一个方法是不相等的,为了解决这个问题.出现了原型模式 1. 原型模式 具体做法是,不在构造函数中定义对象实例的信息,而是将这些…

网络协议各层概述

网络协议概述 OSI是一个开放性的通信系统互连参考模型&#xff0c;他是一个定义得非常好的协议规范。OSI模型有7层结构&#xff0c;每层都可以有几个子层。 OSI的7层从上到下分别是 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层&#xff1b; 其中高层&…

A start job is running for Raise network interface(5min 13s )问题解决方法

命令&#xff1a;sudo vim /etc/systemd/system/network-online.target.wants/networking.service将里面的TimeoutStartSec5min 修改为TimeoutStartSec2sec 然后重启系统&#xff0c;就可以生效了&#xff0c;开机速度很快 转载于:https://www.cnblogs.com/sea-stream/p/98615…

javascript --- 实现对象的深拷贝

浅拷贝和深拷贝 浅拷贝: 只拷贝一层.当对象是复杂数据类型(Object、 Array)时,只拷贝引用深拷贝: 多层拷贝.复杂数据类型,会重新分配内存空间. 实现浅拷贝的2种方法 使用for ... in 实现 var obj {name: marron,age: 18,msg: {sex: "1" } } var o {}; for(let …

Qt与FFmpeg联合开发指南(二)——解码(2):封装和界面设计

与解码相关的主要代码在上一篇博客中已经做了介绍&#xff0c;本篇我们会先讨论一下如何控制解码速度再提供一个我个人的封装思路。最后回归到界面设计环节重点看一下如何保证播放器界面在缩放和拖动的过程中保证视频画面的宽高比例。 一、解码速度 播放器播放媒体文件的时候播…

Bzoj1051 受欢迎的牛

每一头牛的愿望就是变成一头最受欢迎的牛。现在有 N 头牛&#xff0c;给你 M 对整数 (A,B)&#xff0c;表示牛 A 认为牛 B 受欢迎。这种关系是具有传递性的&#xff0c;如果 A 认为 B 受欢迎&#xff0c;B 认为 C 受欢迎&#xff0c;那么牛 A 也认为牛 C 受欢迎。你的任务是求出…

node --- 模块加载机制

1. Node.js中模块加载机制 1.1 模块查找规则-当模块拥有路径但没有后缀时 require(./find.js); require(./find);require方法根据模块路径查找模块,如果是完整路径,直接进入模块如果模块后缀省略,先找同名JS文件再找同名JS文件夹 require(./find); // 以上会先找到命令行目录…

51Nod 蜥蜴和地下室(搜索)

哈利喜欢玩角色扮演的电脑游戏《蜥蜴和地下室》。此时&#xff0c;他正在扮演一个魔术师。在最后一关&#xff0c;他必须和一排的弓箭手战斗。他唯一能消灭他们的办法是一个火球咒语。如果哈利用他的火球咒语攻击第i个弓箭手&#xff08;他们从左到右标记&#xff09;&#xff…

多线程——实现Runnable接口实现一个多线程

实现Runnable接口实现一个多线程 Runnable接口源码&#xff1a; package java.lang; //Runnable接口源码只有一个run方法 public interface Runnable {public abstract void run(); } 实现Runnable的两个多线程类&#xff1a; public class RunnableThread1 implements Runnabl…

javascript --- 文件上传即时预览 闭包实现多图片即时预览

使用javascript原生功能实现,点击上传文件,然后再网页上显示出来 1. 初级显示 1.1 准备一个input标签和一个img标签 <input typefile id"file"> <img id"preview" src"">1.2 js代码如下 // 将上传的图片显示到页面上function sho…

第一次作业:深入Linux源码分析进程模型

一.进程的概念 第一&#xff0c;进程是一个实体。每一个进程都有它自己的地址空间&#xff0c;一般情况下&#xff0c;包括文本区域&#xff08;text region&#xff09;、数据区域&#xff08;data region&#xff09;和堆栈&#xff08;stack region&#xff09;。文本区域存…

关于模型验证那点事儿

今天应笑笑老师之问&#xff0c;做了一个模型验证的例子&#xff0c;发现之前对这个东西的理解太片面&#xff0c;重新整理了一下思路 字段验证优先级高于类验证 什么是类验证呢&#xff1f;就是两个字段组合的验证&#xff0c;比如你Admin不允许修改密码&#xff0c;你修改密码…

mongoose --- createUser

说明 源代码记录、遗忘回顾mongoDB默认不需要使用账号密码即可访问数据库.下面是给mongoDB添加超级管理员和普通用户的方法 以系统管理员的方式运行powershell连接数据库 mongo查看数据库: show dbs切换到admin数据库: use admin创建超级管理员账户: db.createUser({user: roo…

Win10安装MySQL5.7.22 解压缩版(手动配置)方法

1.下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/5.7.html#downloads 直接点击下载项 下载后&#xff1a; 2.可以把解压的内容随便放到一个目录&#xff0c;我的是如下目录&#xff08;放到C盘的话&#xff0c;可能在修改ini文件时涉及权限问题&#xff0c;之后我…

Elemant-UI日期范围的表单验证

Form 组件提供了表单验证的功能&#xff0c;只需要通过 rules 属性传入约定的验证规则&#xff0c;并将 Form-Item 的 prop 属性设置为需校验的字段名即可。但是官网的示例只有普通日期类型的验证&#xff0c;没有时间范围的验证。 一开始&#xff0c;我认为时间时间范围的是一…

node --- [express项目] 开发环境下使用morgan控制台输出访问信息

说明 源代码记录、遗忘回顾 process.env node中提供了一个process.env接口用于访问计算机中的系统环境变量. 可以利用以上属性来区分当前的环境是开发环境还是生产环境,代码如下: if (process.env.NODE_ENV development) {console.log(当前环境是开发环境) } else {consol…

Dynamics CRM 访问团队的使用

访问团队和负责人团队的区别是&#xff1a;负责人团队可以拥有记录&#xff0c;访问团队不能拥有记录也不能加入解决方案中。 访问团队用法1&#xff1a;可以将不同组织的人员加入到访问组实现数据的更新、删除、共享 访问团队用法2&#xff1a;访问团队模板的使用 步骤一&…

业务逻辑

快捷支付接口规范 问题背景 持卡人身份验证持卡人在发卡银行提供的身份验证服务器进行验证&#xff0c;将结果告知商户资金清算资金清算在身份验证通过后进行即时清算&#xff0c;也可能是通过专用资金清算网络进行传统方法弊端 持卡人需要访问很多网站才能完成一次完整支付 &a…