webpack基础搭建 dev的设置 loader包的引入 babel处理高级语法

Vue.js - Day5 - Webpack

在网页中会引用那些常见的静态资源?

  • JS
  • .js .jsx .coffee .ts(TypeScript 类 C# 语言)
  • CSS
  • .css .less .sass .scss
    +Image
  • .jpg .png .jpeg .bmp .gif .svg
  • 字体文件 (fonts)
  • .svg .ttf .eot .woff .woff2
  • 模版文件
  • .ejs .jade .vue 【这是在webpack 中定义组件的方式, 推荐这么用】

网页中引入的静态资源多了以后会有什么问题???

  1. 网页加载速度慢, 因为 我们 要发起很多的二次请求;
  2. 要处理错综复杂的依赖关系

如何解决上述的两个问题

  1. 合并、压缩、精灵图、图片的Base64编码
  2. 可以使用之前学过的requireJS、 也可以使用webpack 可以解决各个包之间的复杂依赖关系;

什么是webpack ?

webpack 是前端的一个项目构建工具, 它是基于 Node.js 开发出来的一个前端工具;

如何完美实现上述的2种解决方案

  1. 使用Gulp, 是基于task 任务的
  2. 使用webpack , 是基于整个项目进行构建的;
  • 借助于webpack 这个前端自动化构建工具, 可以完美实现资源的合并、打包、压缩、混淆等诸多功能。
  • 根据官网的图片介绍webpack打包的过程
  • webpack官网

webpack 安装的两种方式

  1. 运行 npm i webpack -g 全局安装 webpack, 这样就能在全局使用webpack 的命令
  2. 在项目根目录中运行 npm i webpack --save-dev 安装到项目依赖中

初步使用webpack打包构建列表隔行变色案例

  1. 运行npm init 初始化项目, 使用npm 管理项目中的依赖包
  2. 创建项目基本的目录结构
  3. 使用 cnpm i jquery --save 安装jquery 类库
  4. 创建 main.js 并书写各行变色的代码逻辑;
    //导入jquery类库
    import $ from 'jquery'

    //设置偶数行背景色, 索引从0 开始, 0 是偶数
    $('#list li:even').css('backgroundColor', 'lightblue');
    //设置奇数行背景色
    $('#list li.odd').css('backgroundColor', 'pink');
  1. 直接在页面上引用 main.js 会报错, 因为浏览器不认识 improt这种高级的JS语法,需要使用 webpack 进行处理, webpack 默认会把这种高级的语法转换为低级的浏览器能识别的语法;

  2. 运行 webpack 入口文件路径 输出文件路径main.js 进行处理;

webpack src/js/main.js dist/bundle.js

使用webpack 的配置文件简化打包时候的命令

  1. 在项目根目录中创建 webpack.config.js
  2. 由于运行webpack命令的时候,webpack 需要指定入口文件和输出文件的路径, 所以, 我们需要在 webpack.config.js 中配置这两个路径;
    // 导入处理路径的模块
    var path = require('path');

    // 导出一个配置对象, 将来webpack来启动的时候, 会默认来查找webpack.config.js, 并读取这个文件中导出的配置对象,来进行打包处理
    module.exports = {
        entry: path.resolve(__dirname, 'src/js/main.js'), //项目入口文件
        output: { // 配置输出选项
            path: path.resolve(__dirname, 'dist'), // 配置输出的路径
            filename: 'bundle.js' //配置输出的文件名
        }
    }

实现webpack 的实时打包构建

  1. 由于每次重新修改代码之后, 都需要手动运行webpack打包的命令, 比较麻烦,所以使用 webpack-dev-server 来实现代码实时打包编译,当修改代码之后,会自动进行打包构建。
  2. 运行 cnpm i webpack-dev-server --save-dev 安装到开发依赖
  3. 安装完成之后, 在命令行直接运行 webpack-dev-server 来进行打包, 发现报错, 此时需要借助于 package.json 文件中的命令, 来进行运行webpack-dev-server 命令, 在scripts 节点下新增 "dev":"webpack-dev-server"指令, 发现可以进行实时打包,但是dist目录下并没有生成bundle.js文件, 这是因为 webpack-dev-server 将打包好的文件放在了内存中
  • bundle.js 放在内存中的好处是:由于需要实时打包编译, 所以放在内存中速度会非常快
  • 这个时候访问webpack-dev-server 启动的 http://localhost:8080/ 网站,发现是一个文件夹的面板, 需要点击到src 目录下, 才能打开我们的index首页, 此时引用不到bundle.js 文件, 需要修改index.html 中的script 的src 属性为:
  • 为了能在访问 http://localhost:8080的时候直接访问到index首页, 可以使用 --contentBase src 指令来修改 dev 指令, 指定启动的根目录:
"dev" : "webpack-dev-server --contentBase src"

同事修改 index 页面中 script 的src 属性为

使用 html-webpack-plugin 插件配置 启动页面

由于使用 --contentBase 指令的过程比较繁琐, 需要指定启动的目录,同时 还需要修改 index.html 中 script 标签的属性, 所以推荐大家使用 html-webpack-plugin 插件配置启动页面。

  1. 巡行 cnpm i html-webpack-plugin --save-dev 安装到开发依赖
  2. 修改 webpack.config.js 配置文件如下:
    //导入 处理路径的模块
    var path = require('path');
    // 导入自动生成 html 文件的插件
    var htmlWcbpackPlugin = require('html-webpack-plugin');

    module.exports = {
        entry: path.resolve(__dirname, 'src/js/main.js'), // 项目入口文件
        output: { // 配置输出选项
            path: path.resolve(__dirname, 'dist'), // 配置输出的路径
            filename: 'bundle.js' // 配置 输出的文件名
        },
        plugins: [// 添加plugins 节点配置插件
            new htmlWebpackPlugin({
                template: path.resolve(__dirname, 'src/index.html'), // 模版路径
                filename: 'index.html' // 自动生成的HTML 文件的名称
            })

        ]
    }
  1. 修改 package.jsonscript 节点中的dev指令如下;
"dev" : "webpack-dev-server"
  1. 将index.html 中script 标签注释掉, 因为 ‘html-webpack-plugin’ 插件会自动把 bundle.js 注入到 index.html 页面中!

实现自动打开浏览器、热更新和配置浏览器的默认端口号

** 注意:热更新在JS 中表现的不是很明显,可以从一会儿要讲到 CSS 身上进行介绍说明 **

方式1:

  • 修改 package.json 的 script 节点如下, 其中 --open 表示自动打开浏览器, --port 4321 表示打开的端口号为4321 , --hot 表示启用浏览器热更新:
"dev" : "webpack-dev-server --hot --port 4321 --open"

方式2:

  1. 修改 webpack.config.js 文件, 新增 devServer 节点如下:
devServer: {
    hot: true,
    open: true,
    prot: 4321
}
  1. 在头部引入 webpack 模块:
var webpack = require('webpack');

3.在plugins 节点下 新增:

new webpack.HotModuleReplacementPlugin()

使用webpack 打包 css 文件

  1. 运行 cnpm i style-loader css-loader --save-dev
  2. 修改 webpack.config.js 这个配置文件:
module: {// 用来配置第三方loader 模块的
    rules: [// 文件的匹配规则
        { test: /\.css$/, use: ['style-loader', 'css-loader'] }//处理css 文件的规则
    ]
}
  1. 注意: use 表示 使用哪些模块来处理 test 所匹配到的文件; use 中相关 loader 模块的调用顺序是从后向前调用的;

使用webpack 打包 less 文件

  1. 运行 cnpm i less-loader less -D
  2. 修改 webpack.config.js 这个配置文件:
{ test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] },

使用webpack 打包 sass 文件

  1. 运行 cnpm i sass-loader node-sass --save-dev
  2. webpack.config.js 中添加处理 sass 文件的loader 模块;
{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] }

使用webpack 处理 css 中的路径

  1. 运行 ‘cnpm i url-loader file-loader --save-dev’
  2. webpack.config.js 中添加处理url 路径的loader 模块:
{ test: /\.(png|jpg|gif)$/, use: 'url-loader' }
  1. 可以通过 ‘limit’ 指定 进行 base64 编码的图片大小; 只有小于指定字节 (byte)的图片才会进行base64编码:
{ test: /\.(png|jpg|gif)$/, use: 'url-loader?limit=43960' },

使用 babel 处理高级JS 语法

  1. 运行 cnpm i babel-core babel-loader babel-plugin-transform-runtime --save-dev 安装babel 的相关 loader 包
  2. 运行 cnpm i babel-preset-es2015 babel-preset-stage-0 --save-dev 安装 babel 转换的语法
  3. webpack.config.js 中添加相关loader 模块, 其中需要注意的是, 一定要把 node_modules 文件夹 添加的排除项:
{ test: /\.js$/, use: 'babel-loader', exclude: /node_modules/ }
  1. 在项目根目录中添加 .babelrc 文件, 并修改这个配置文件如下:
{
    "presets" : ["es2015", "stage-0"],
    "plugins" : ["transform-runtime"]
}
  1. ** 注意:语法插件 babel-preset-es2015 可以更新为 babel-preset-env, 它包含了所有的ES 相关的语法: **

相关文章

babel-preset-env: 你需要的唯一Babel插件
Runtime transform 运行时编译es6

你可能感兴趣的:(框架)