1、编译ES6

1/创建文件夹,在命令行执行npm init。然后安装babel-loader

npm install babel-loader@8.0.0 @babel/core @babel/preset-env复制代码

2/在文件夹下创建webpack.config.js,配置相关属性

module.exports = {entry: {app: './app'},output: {filename: '[name]-[hash:5].js'},module: {rules: [{test: /\.js$/,exclude: '/node-modules/',use: 'babel-loader'}]}}复制代码

3/在入口文件app.js中编写ES6有关代码

let func = () => { }const MUN = 45let arr = [1, 2, 4]let arrB = arr.map(item => item * 2)console.log('new Set(arrB)' + new Set(arrB))复制代码

4/配置babel的preset。在文件.babelrc中。在target属性中可以设置环境(浏览器或者node)

{  "presets": [    [      "@babel/preset-env",      {        "targets": {          "chrome": "52"        }      }    ]  ]}复制代码

4/在命令行执行打包命令webpack。打包成功后,在打包后的文件中查看被babel编译后的代码。其中箭头函数变成function,let和const被编译成var

var func = function func() {};var MUN = 45;var arr = [1, 2, 4];var arrB = arr.map(function (item) {  return item * 2;});console.log('new Set(arrB)' + new Set(arrB));复制代码

5/在一些浏览器版本中,有一些函数和方法(Generator,Set,Map,Array.from,Array.prototype.includes)没有办法利用babel转换,这个时候就需要用到相关的插件。可以选择以下其中一个使用即可:

①使用babel-polyfill插件。特点是全局垫片,为应用为准备的。先安装然后在项目根目录中使用

//安装
npm install babel-polyfill --save
//使用:在项目根目录中导入
import 'babel-polyfill'复制代码

②使用Babel Runtime Transform插件。特点是局部垫片,为开发框架使用。先安装然后在.babelrc配置文件中配置

安装@babel版本,是确保和我们刚开始的时候安装babel-loader@8.0.0中保持一致,不然容易报版本错误

//安装
npm install --save-dev @babel/plugin-transform-runtime
npm install --save @babel/runtime
//配置:在.babelrc中配置
{"plugins": ["@babel/transform-runtime"]
}复制代码

2、打包公共代码

利用CommonsChunkPlugin插件对公共代码进行代码。

对单页面应用的打包是没有用的,因为单页面一般是利用懒加载的,有其他的打包方式。

①对多页面应用的普通打包

import path = require('path')                                               webpack.config.js
import webpack = require('webpack')
module.exports={entry:{'pageA':'./src/pageA','pageB':'./src/pageB'},output:{path:path.resolve(__dirname,'./dist'),filename:'[name].bundle.js',chunkFilename:'[name].chunk.js'},plugins:[new webpack.optimize.CommonsChunkPlugin({name:'common',minChunks:2})]
}复制代码

在命令行对多页面应用进行webpack打包:

②对第三方插件打包

module.exports={entry:{'pageA':'./src/pageA','pageB':'./src/pageB','vendor':['lodash']},...plugins:[new webpack.optimize.CommonsChunkPlugin({name:'vendor',minChunks:Infinity})]
}复制代码

命令行webpack打包后:

③把webpack代码提取出来

module.exports={...plugins:[new webpack.optimize.CommonsChunkPlugin({ // webpackname:'manifest',minChunks:Infinity})new webpack.optimize.CommonsChunkPlugin({ // 第三插件name:'vendor',minChunks:Infinity})]
}复制代码

在命令行webpack打包:

④把业务公共代码、第三方插件和webpack各自提取出来

module.exports={...plugins:[new webpack.optimize.CommonsChunkPlugin({ //业务公共代码name:'common',minChunks:2,chunks:['pageA','pageB']})new webpack.optimize.CommonsChunkPlugin({ //第三方插件+webpacknames:['vendor','manifest'],minChunks:Infinity})]
}复制代码

webpack打包:

3、代码分割和懒加载

(1)代码分割之前

import path = require('path')                                               webpack.config.js
import webpack = require('webpack')
module.exports={entry:{'pageA':'./src/pageA'},output:{path:path.resolve(__dirname,'./dist'),filename:'[name].bundle.js',chunkFilename:'[name].chunk.js'}
}复制代码

webpack打包只有一个:

(2)代码分割之后:利用require.ensure把第三方模块分割出来

利用webpack.method中有一个require.ensure()方法来进行代码分割。

impoor subPageA from './subPageA'                                 pageA.js
import subPageB from './subPageB'
//动态加载。加载并不表示执行,需要在第二个参数callback中require一下才算真正的执行。
//第一个参数表示加载模块,第二个是成功回调,第三个是分支名称
require.ensure(['lodash'],function(){var _ = require('lodash')_.join(['1','2'],'3')
},'vendor')
export default pageA复制代码

webpack打包有两个分支:

(3)代码分割之后:利用require.ensure把业务代码分割出来

//动态加载业务模块 (根据逻辑按需加载不同的业务模块)                                 pageA.js
if(page==='subPageA'){require.ensure(['./subPageA'],function(){var subPageA = require('./subPageA')},'subPageA')
}else if(){require.ensure(['./subPageB'],function(){var subPageB = require('./subPageB')},'subPageB')
}
...
export default PageA复制代码

webpack打包之后:

(4)代码分割:利用import()方法分割

返回一个Promise,在回调then方法中直接使用。利用注释的方法给分支设置名称,如果分支名一样,则webpack打包进一个分支

if(page==='subPageA'){                                                      pageA.jsimport(/* webpackChunkName:'subPageA' */'./subPageA').then(function(subPageA){console.log(subPageA)})
}else if(page==='subPageB'){import(/* webpacjChunkName:'subPageB' */'./subPageB').then(function(subPageB){console.log(subPageB)})
}
export default pageA复制代码

webpack打包结果如下:

(5)异步代码分割+公共代码提取(结合CommonsChunkPlugin插件)

module.exports={                                                           webpack.config.jsentry:{'pageA':'./src/pageA','pageB':'./src/pageB','vendor':['lodash']},...plugins:[new webpack.optimize.CommonsChunkPlugin({async:'async-common',children:tureminChunks:2}),new webpack.optimize.CommonChunkPlugin({name:['vendor','manifest'],minChunks:'Infinity'})]
}复制代码

webpack打包结果:

3、处理css

(1)style-loader   生成style标签插入到heade标签中

style-loader    将css文件中的css代码生成的<style>放到<head>标签中

npm install style-loader --save-dev
// webpack.config.js
{module:{rules:[{test:/\.css$/,use:[{loader:'style-loader'},{loader:'css-loader'}]}]}
}复制代码

style-loader/url    在head标签中添加一个link取代生成的style标签

// webpack.config.js
{module:{rules:[{test:/\.css$/,use:[{loader:'style-loader/url'},{loader:'file-loader'}]}]}
}复制代码

style-loader/useable    控制style标签的可用或不可用属性

//app.js
import base from './css/base.css'
var flag = false
setInterval(function(){if(flag){base.use()  //可用样式}else{base.unuse() //不可用样式}
},500)//webpack.config.js
{module:{rules:[{test:/\.css$/,use:[{loader:'style-loader/useable'},{loader:'css-loader'}]}]}
}
复制代码

style-loader的options:主要看transform属性,是个传入原始css的函数,返回修改过的css。其他的属性可查看文档。

//webpack.config.js
{module:{rules:[{test:/\.css$/,use:[{loader:'style-loader',options:{transform:'css.transform.js'    //相当于webpack.config.js目录下的的文件} },{loader:'css-loader'}]}]}
}//css.transform.js(一个简单的demo)module.exports=function(css){//改变原始的css(跟环境变量产生联系)if(window.innerWidth>=768){return css.replace('red','green')}else{return css.replace('red','yellow')}
}复制代码

(2)css-loader

css-style像import和require()一样解释@import和url()

//安装
npm install --save-dev css-loader
复制代码
//webpack.config.js
{loader:'css-loader',options:{modules:true,localIdentName:'[path][name]-[loca]-[hase:base64:5]'    }
}复制代码
//base.css
.box{composes:bigBox from './common.css'  /* 引入common模块的css样式(老的写法) */...
}复制代码

(3)配置sass或者less,看官网文档即可

安装less以及依赖
pm install --save-dev less-loader less
复制代码
安装sass以及依赖
npm install sass-loader node-sass  --save-dev
复制代码

(4)提取css代码

webpack(一)相关推荐

  1. 第四天:Vue组件的slot以及webpack

    插槽 认识slot 在生活中,很多地方都有插槽,电脑的USB插槽,插板中的电源插槽等. 插槽的目的是让我们原来的设备具备更多的扩展性.比如电脑的USB我们可以插入U盘.鼠标.键盘.硬盘.手机.音响等等 ...

  2. 深入浅出的webpack构建工具---DllPlugin DllReferencePlugin提高构建速度(七)

    阅读目录 一:什么是DllPlugin 和 DllReferencePlugin?作用是什么? 二:在项目中如何使用 DllPlugin 和 DllReferencePlugin? 三:DllPlug ...

  3. linux怎么卸载webpack,安装webpack后,执行webpack -v命令时报错:SyntaxError: Block-sc

    安装webpack后,执行webpack -v命令时报错如下: [root@FreeServer ~]# webpack -v /usr/local/node-v4.4.7-linux-x64/lib ...

  4. express给html设置缓存,webpack + express 实现文件精确缓存

    由于最近开发的个人博客(Vue + node)在使用过程中,发现网络加载有点慢,所以打算对它进行一次优化.本次优化的目标如下: index.html 设置成 no-cache,这样每次请求的时候都会比 ...

  5. vue webpack打包入口文件是哪个_Vue项目起步

    一,安装nodejs软件(直接商城搜索安装即可). 二,配置npm npm install npm -g 三,配置webpack,在cmd中安装. npm install -g webpack npm ...

  6. webpack打开项目命令_webpack前端模块打包工具基本使用的详细记录(一)

    webpack简介 我们都知道,Webpack 是当下最热门的前端资源模块化管理和打包工具.它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源.还可以将按需加载的模块进行代码分隔,等 ...

  7. 在Vue的webpack中结合runder函数

    在Vue的webpack中结合runder函数 1.引入: <h1>下面是vue的内容:</h1><div id="app"><login ...

  8. webpack入门之简单例子跑起来

    webpack入门之简单例子跑起来 webpack介绍 Webpack是当下最热门的前端资源模块化管理和打包工具,它可以将很多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源,还可以将按需加载 ...

  9. webpack打开项目命令_配置webpack中dev.env.js、prod.env.js,解决不同命令下项目启动和打包到指定的环境...

    前后端分离的项目开发中,我们有开发环境.测试环境.预生产环境和生产环境. 1.开发环境下调试接口的时候,一般都会有好几个接口地址(开发服务器上的,本地的,接口开发人员的,七七八八的接口地址),要根据情 ...

  10. 修改html时webpack热更新,webpack学习之路(二)webpack-dev-server实现热更新

    上一章对webpack的配置有了简单的认识. 这一章,我需要学习的是webpack热更新,因为在开发过程中,不希望当文件更改时,人肉去编译文件,刷新浏览器. webpack热更新 webpack-de ...

最新文章

  1. 2017年深度学习优化算法最新进展:如何改进SGD和Adam方法?
  2. 类型转换_异常处理机制
  3. 第二轮冲刺-Runner站立会议04
  4. AAAI2021论文合集汇总!(持续更新)
  5. jQuery UI resizble、draggable的div包含iframe导致缩放和拖拽的不平滑解决方法
  6. JavaScript语言特性
  7. 伪装 php 版本号,linux伪装隐藏Nginx,PHP版本号提升服务器安全性
  8. 济源一中2021高考成绩查询入口,济源一中2019高考成绩喜报、一本二本上线人数情况...
  9. MySQL Workbench给其他IP用户分配权限
  10. 调通sina33下的AP6212A0(WIFI+BT)(V1.1版本)
  11. 这样的员工一定会成为高管
  12. 贴片电阻分类、阻值、功率、封装、尺寸
  13. 涨跌的例题用C语言编辑,基于LSTM的股票涨跌分析-pytorch
  14. WiFi远程监控,监控摄像头只有在WiFi环境才能使用吗
  15. LodeRunner2的Wacky Wall 11关
  16. Java时间轮算法的实现
  17. c++ 小游戏 NO6 跑酷游戏
  18. win11待机时间怎么设置 windows待机时间设置的步骤方法
  19. 头发保护 - 二硫化硒洗剂
  20. java 多线程的三种写法

热门文章

  1. Umbraco中的Examine Search功能讲解
  2. 跨境移动互联网的魅力演绎,hao123无论成就下一个条目?
  3. 黑马程序员入学基础测试(五)
  4. 152-Maximum Product Subarray
  5. hdu 1074 Doing Homework
  6. Ubunt 服务教程集锦
  7. 17082 两个有序数序列中找第k小
  8. 前端学习JQuery篇03——基本操作(效果)
  9. python的学习之路
  10. 5.28 周末笔记(三)