webpack学习(1)

这篇文章主要介绍了webpack使用的一个小demo,来学习如何利用webpack构建项目,以及打包js文件,通过安装loader模块打包csslesssass等文件。

1. nrm(牛肉面)的安装使用

作用:提供了一些最常用的NPM包镜像地址,能够让我们快速的切换安装包时候的服务器地址;
什么是镜像:原来包刚一开始是只存在于国外的NPM服务器,但是由于网络原因,经常访问不到,这时候,我们可以在国内,创建一个和官网完全一样的NPM服务器,只不过,数据都是从人家那里拿过来的,除此之外,使用方式完全一样;

  1. 运行npm i nrm -g全局安装nrm包;
  2. 使用nrm ls查看当前所有可用的镜像源地址以及当前所使用的镜像源地址;
  3. 使用nrm use npmnrm use taobao切换不同的镜像源地址;

注意: nrm 只是单纯的提供了几个常用的 下载包的 URL地址,并能够让我们在 这几个 地址之间,很方便的进行切换,但是,我们每次装包的时候,使用的 装包工具,都是 npm

2. webpack认识

  • 2.1 常见的网页静态资源

    1. JS资源
     - .js  .jsx  .coffee  .ts(TypeScript  类 C# 语言)
    2. CSS资源
     - .css  .less   .sass  .scss
    3. Images资源
     - .jpg   .png   .gif   .bmp   .svg
    4. 字体文件(Fonts)资源
     - .svg   .ttf   .eot   .woff   .woff2
    5. 模板文件资源
     - .ejs   .jade  .vue【webpack中定义组件的方式,推荐】
    
  • 2.2 网页中引入静态资源后出现问题以及解决方法

    引入静态资源后出现问题?
    1. 因为要发起很多的二次请求导致网页加载速度慢
    2. 要处理错综复杂的依赖关系
    
    解决方法:
    1. 合并、压缩、精灵图、图片的Base64编码
    2. 可以使用之前学过的requireJS、也可以使用webpack解决各个包之间的复杂依赖关系;
    
    使用Gulp和webpack的区别:
    a. Gulp是基于 task 任务的;
    b. Webpack是基于整个项目进行构建的;
    - 借助于webpack这个前端自动化构建工具,可以完美实现资源的合并、打包、压缩、混淆等诸多功能。
    - [webpack官网](https://webpack.github.io/)
    
  • 2.3 什么是webpack

    webpack是前端项目构建工具,她是基于node.js开发出来的

3. 使用webpack构建隔行变色的小demo

  • 3.1 安装webpack

    # 1.全局安装 npm i webpack -g
    # 默认安装最新版@4.28.1 由于webpack版本兼容问题,降低安装版本解决问题
    npm i [email protected] -g
    
    # 2.在项目根目录中运行下面命令安装到项目依赖中,否则无法使用webpack-dev-server
    npm i [email protected] --save-dev
    
  • 3.2 初始化项目,使用npm管理项目中的依赖包

    npm init -y
    
  • 3.3 创建项目基本目录结构

    ├─dist               最终要发布的版本文件夹
    ├─src			    开发中要用到的静态资源
       ├──css		    css样式、less、sass等
       ├──js			js文件
       ├──images		 图片资源
       ├──index.html	 首页
       └──main.js 		 项目入口
    ├─node_modules		 第三方包(生成)	
    ├─package.json		 包的描述文件(生成)
    ├─package-lock.json	  第三方包版本锁定文件(生成,npm5+才有)
    └─webpack.config.js	  webpack配置文件
    
  • 3.4 在项目中安装jquery

    npm i jquery -D
    
  • 3.5 创建main.js

    	// 导入jquery类库
        import $ from 'jquery'
    
        // 设置偶数行背景色,索引从0开始
        $('li:even').css('backgroundColor','cyan');
        // 设置奇数行背景色
        $('li:odd').css('backgroundColor','gray');
    

    直接在页面上引用main.js会报错,因为浏览器不认识import这种高级的es6语法,需要使用webpack进行处理,webpack默认会把这种高级的语法转换为低级的浏览器能识别的语法。

    命令行运行下面命令对main.js进行打包处理:

    # webpack 入口文件路径 输出文件路径
    webpack src/js/main.js dist/bundle.js
    

    运行完成后,在index.html中引入bundle.js在浏览器中打开就可以实现隔行变色效果了。

4. 基于隔行变色demo使用webpack的配置文件简化打包过程

  • 4.1 在项目根目录中创建webpack.config.js

    // 运行webpack命令时需要指定入口文件和输出文件的路径,我们在webpack.config.js中配置这两个路径
    // 导入处理路径的模块
    var path = require('path');
    var config = {
        entry: path.resolve(__dirname, 'src/js/main.js'), // 项目入口文件
        output: { // 配置输出选项
            path: path.resolve(__dirname, 'dist'), // 配置输出的路径
            filename: 'bundle.js' // 配置输出的文件名
        }
    }
    // 导出一个配置对象,将来webpack在启动的时候,会默认来查找webpack.config.js,并读取这个文件中导出的配置对象,来进行打包处理
    module.exports = config;
    
    // 当我们在 控制台,直接输入 webpack 命令执行的时候,webpack 做了以下几步:
    // 1. 首先,webpack 发现,我们并没有通过命令的形式,给它指定入口和出口
    // 2. webpack 就会去 项目的 根目录中,查找一个叫做 `webpack.config.js` 的配置文件
    // 3. 当找到配置文件后,webpack 会去解析执行这个 配置文件,当解析执行完配置文件后,就得到了 配置文件中,导出的配置对象
    // 4. 当 webpack 拿到 配置对象后,就拿到了 配置对象中,指定的 入口  和 出口,然后进行打包构建;
    

    配置好webpack.config.js文件后,在命令行中输入webpack回车就能实现打包了,每次修改代码之后运行webpack命令进行打包处理,然后到页面刷新看见修改后的变化。

  • 4.2 使用 webpack-dev-server 这个工具来实现自动打包编译的功能

    # 安装webpack-dev-server 指定版本
    npm i [email protected] -D
    # 安装完毕后,这个工具的用法和 webpack 命令的用法完全一样
    # 由于在项目中本地安装的webpack-dev-server所以无法把它当作 脚本命令 在命令行(powershell)中直接运行
    # 只有那些安装到全局 -g 的工具,才能在 终端中正常执行
    # 注意: webpack-dev-server 这个工具,如果想要正常运行,要求在本地项目中,必须安装 webpack,这就是为什在开始已经全局安装webpack的时候还要进行一次项目安装 npm i [email protected] --save-dev
    # webpack-dev-server 帮我们打包生成的 bundle.js 文件,并没有存放到 实际的 物理磁盘上;而是直接托管到了电脑的内存中,所以我们在项目根目录中根本找不到这个打包好的 bundle.js;
    # 我们可以认为 webpack-dev-server 把打包好的文件,以一种虚拟的形式托管到了项目的根目录中,虽然我们看不到它,但是可以认为, 和 dist  src   node_modules 是平级,有一个看不见的文件,叫做 bundle.js
    

    安装完成后在命令行直接运行webpack-dev-server进行打包,发现报错,此时需要借助package.json文件中的指令来运行webpack-dev-server命令,在scripts节点下新增"dev": "webpack-dev-server"指令,发现可以进行实时打包,但是dist目录下并没有生成bundle.js文件,这是因为webpack-dev-server将打包好的文件放在了内存中。

    "scripts": {
        "dev": "webpack-dev-server"
    }
    
    # 命令行中运行
    npm run dev
    

    bundle.js放在内存中的好处是:由于需要实时打包编译,所以放在内存中速度会非常快,这个时候访问webpack-dev-server启动的http://localhost:8080/网站,发现是一个文件夹的面板,需要点击到src目录下,才能打开我们的index首页,此时引用不到bundle.js文件,需要修改index.html中script的src属性为:

    <script src="../bundle.js"></script>
    

    为了能在访问http://localhost:8080/的时候直接访问到index首页,可以使用--contentBase src指令来修改dev指令,指定启动的根目录:

    "dev": "webpack-dev-server --contentBase src"
    

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

    <script src="/bundle.js"></script>
    
  • 4.3 使用html-webpack-plugin插件配置启动页面

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

    • a. 运行npm i [email protected] --save-dev安装到开发依赖

      npm i [email protected] --save-dev
      
    • b. 修改webpack.config.js配置文件如下:

      // 导入处理路径的模块
      var path = require('path');
      // 导入自动生成HTMl文件的插件
      var htmlWebpackPlugin = require('html-webpack-plugin');
      
      var config = {
          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文件的名称
              })
          ]
      };
      module.exports = config;
      
    • c. 修改package.jsonscript节点中的dev指令如下:

      "dev": "webpack-dev-server"
      
    • d. 将index.html中script标签注释掉,因为html-webpack-plugin插件会自动把bundle.js注入到index.html页面中!

5. 基于上面的demo实现自动打开浏览器、热更新和配置浏览器的默认端口号

  • 方法一:

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

    "dev": "webpack-dev-server --hot --port 3000 --open"
    
  • 方法二:

    a. 修改webpack.config.js文件,新增devServer节点如下:

    devServer:{
        open: true, // 自动打开浏览器
        port: 3000, // 设置启动时候的运行端口
        contentBase: 'src', // 指定托管的根目录
        hot: true  // 启用热更新 第1步
    }
    

    b. 在头部引入webpack模块:

    // 启用热更新 第2步 引入webpack包
    var webpack = require('webpack');
    

    c. 在plugins节点下新增:

    plugins: [ // 配置插件节点
        new webpack.HotModuleReplacementPlugin(), // new 一个热更新模块对象,这是启用热更新 第 3 步
    ]
    

6. 使用webpack打包csslesssass文件

  • 打包css文件

    a. 安装loader模块

    npm i [email protected] [email protected] --save-dev
    

    b. 修改webpack.config.js这个配置文件:

    module: { // 用来配置第三方loader模块的
        rules: [ // 文件的匹配规则
            { test: /\.css$/, use: ['style-loader', 'css-loader'] }//处理css文件的规则
        ]
    }
    // 注意:`use`表示使用哪些模块来处理`test`所匹配到的文件
    // `use`中相关loader模块的调用顺序是从后向前调用的
    
  • 打包less文件

    a. 安装loader模块

    npm i [email protected] [email protected] -D
    

    b. 修改webpack.config.js这个配置文件,在rules中添加:

    { test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] }
    
  • 打包sass文件

    a. 安装loader模块

    npm i [email protected] [email protected] --save-dev
    

    b. 修改webpack.config.js这个配置文件,在rules中添加:

    { test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] }
    

    c. 备注:安装node-sass时如果安装不成功,可在通过下面网址提供的方法本地安装

    https://www.cnblogs.com/codebook/p/10274990.html
    

7. 备注:隔行变色demo文件

  • main.js

    // main.js是项目入口文件
    
    // 导入jquery -- import ** from ** 是es6的语法导入模块方式
    import $ from 'jquery';
    
    // 利用 import 语法 导入样式表
    import './css/index.css';
    import './css/index.less';
    import './css/index.scss';
    
    $(function (){
       $('li:odd').css('backgroundColor', 'cyan');
       $('li:even').css('backgroundColor', function (){
           return '#' + 'ddd'
       })
    });
    
  • webpack.config.js

    const path = require('path');
    const webpack = require('webpack');
    
    // 导入 在内存中生成 HTML 页面的 插件
    const htmlWebpackPlugin = require('html-webpack-plugin');
    
    // 这个js配置文件,通过node中的模块操作,向外暴露一个配置对象
    const config = {
        // 入口,表示webpack要打包哪个文件
        entry: path.join(__dirname, './src/main.js'),
        // 出口相关配置
        output: {
            path: path.join(__dirname, './dist'), // 指定打包好的文件输出到哪个路径
            filename: 'bundle.js' // 指定输出文件名称
        },
        devServer: { // 这是配置 dev-server 命令参数的第二种形式,这种方式相对麻烦一些,也是在命令行使用 npm run dev 执行
            //推荐在package.json中使用命令  --open --port 3000 --contentBase src --hot
            open: true, // 自动打开浏览器
            port: 3000, // 设置启动时候的运行端口
            contentBase: 'src', // 指定托管的根目录
            hot: true  // 启用热更新 第1步
        },
        plugins: [ // 配置插件节点
            new webpack.HotModuleReplacementPlugin(), // new 一个热更新模块对象,这是启用热更新 第 3 步
            new htmlWebpackPlugin({ // 创建一个在内存中 生成 HTML  页面的插件
                template: path.join(__dirname, './src/index.html'), // 指定模板页面,将来会根据指定的页面路径,去生成内存中的页面
                filename: 'index.html' // 指定生成的页面的名称
            })
        ],
        module: { // 匹配所有第三方模块加载器
            rules: [ // 所有第三方模块 匹配规则
                { test: /\.css$/, use: ['style-loader', 'css-loader'] },
                { test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] },
                { test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] }
            ]
        }
    };
    
    module.exports = config;
    
  • package.json ( 注意:json文件中不能有注释 )

    {
      "name": "webpack-demo",
      "version": "1.0.0",
      "description": "",
      "main": "webpack.config.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",
        "dev2": "webpack-dev-server --open --port 3000 --contentBase src --hot",
        "dev": "webpack-dev-server"
      },
      "keywords": [],
      "author": "",
      "license": "ISC",
      "devDependencies": {
        "css-loader": "^0.28.7",
        "html-webpack-plugin": "^2.30.1",
        "less": "^2.7.3",
        "less-loader": "^4.0.5",
        "node-sass": "^4.11.0",
        "sass-loader": "^6.0.6",
        "style-loader": "^0.19.0",
        "webpack": "^3.8.1",
        "webpack-dev-server": "^2.9.3"
      },
      "dependencies": {
        "jquery": "^3.3.1"
      }
    }
    

猜你喜欢

转载自blog.csdn.net/weixin_44539392/article/details/86515263
今日推荐