webpack 搭建使用webpack进行模块化开发

webpack 项目的搭建配置

webpack 项目的搭建

  1. 创建项目目录

    webpack_text // 项目名
    	src
        	index.js
    		index.html
    
  2. 初始化项目

    npm init -y
    
  3. 把webpack 安装到项目

    cnpm i webpack webpack-cli -D 
    
  4. 这个时候,可以运行的你的webpack项目了 ,直接在终端输入webpack,没有错,就是那么简单,运行结束之后,就会自动生成一个dist文件,里面就有打包的好的代码 main.js文件了

    webpack 
    
  5. 因为webpack默认会打包src 目录下的index.js,并把打包好的文件保存到dist目录下和命名为main.js,在index.js 中写入简单javaScript 代码测试,(问题1:那么如果不想要打包index.js 文件呢,不想把打包好的文件命名为main.js 呢 ,后面再说,先把项目搭建起来先

    // 这是index.js 文件
    console.log("OK")
    
  6. 怎么使用打包好的文件呢,在需要引用的地方,用script 引用,这样在控制台,就可以看到“OK”了

    <script src="../dist/main.js"></script>
    
  7. 这个时候,我们的webpack 项目就已经搭建成功了,总结一下:

    • 新建目录 和 文件

    • 初始化项目 npm init -y

    • 安装 webpack 和 webpack-cli

    • 终端中运行 webpack 打包index.js 文件

    • 使用



webpack 的基本配置

  1. 经过以上操作,我们就可以快乐的使用webpack 打包代码了

    while(想看看改了代码的效果){
    	1、修改代码 
    	2、运行 webpack
    	2、打开浏览器 刷新
    }
    
  2. 从以上死循环中可以看出,快乐只是短暂的!我们可以使用webpack-dev-server来自动打包原理和Node.js 中的nodemon工具一样,一保存就会帮我们自动打包 ),webpack-dev-server还可以使项目通过localhost本地方式进行访问我们的项目(这一点和Apache类似

  3. 安裝配置webpack-dev-server

  4. 安装

    cnpm i webpack-dev-server -D
    
  5. 配置

    • 方法一:在package.json 文件中配置,默认是通过访问项目:http://localhost:8080/

      // 在package.json 中的script节点的中,直接添加 "dev": "webpack-dev-server",
      //这个时候,你就可以直接使用wepack-dev-server了
      
      "scripts": {
          "test": "echo \"Error: no test specified\" && exit 1",
          "dev": "webpack-dev-server"
      }
      
      //当然你也可以配webpack-dev-server 的其他设置
      // --open ===>打开浏览器
      // --port 3001 ===> 设置端口 默认是8080
      // --contentBase ===> 打开的目录 默认是项目的根目录 / ,设置为 src 
      // --hot ==> 热更新,只打包更新修改的部分代码,而不是整个项目从新打包
       "scripts": {
          "test": "echo \"Error: no test specified\" && exit 1",
          "dev": "webpack-dev-server --open --port 3001 --contentBase  src --hot"
        }
      
    • 方法二:

      1、同样需要在package.json 文件中的script节点的中,添加 “dev”: “webpack-dev-server”

      2、在项目的跟目录下(就是和src 同级),新建一个webpack.config.js文件,我们可以在这个配置 文件中配置我们webpack项目

      const path = require('path')
      // 启动热更新第二步:导入webpack ,因为hot热更新的插件是webpack 的内置模块
      const webpack = require('webpack')
      module.exports = {
          devServer:{        // 配置webpack-dev-server
              open:true,     //打开浏览器
              port:3001, //设置端口 默认是8080
              contentBase:'src',  //打开的目录 默认是项目的根目录 / ,设置为 src 
              hot:true        //启动热更新第一步
          },
          plugins:[
              new webpack.HotModuleReplacementPlugin() // 启动热更新第三步: 
          ]
      }
      
  6. 使用, 到了这里,你运行下面的神秘代码,浏览器就会神奇地自动打开,并显示index.html 的内容

    npm run dev
    
  7. webpack的工作流程(问题1 的答案

    当在控制台运行: webpack 或者 npm run dev
    1、webpack发现没有通过命令行的形式指定入口和出口
    2、找到配置文件,webpack.config.js
    3、解析执行配置文件,导出配置对象
    4、当webpack拿到配置对象后,根据入口和出口进行打包构建

    module.exports = {
        entry:path.join(__dirname,'./src/index.js'),   //入口,表示要使用webpack 打包那个文件
        output:{ //输出文件的配置,输出文件的目录,和文件名
            path:path.join(__dirname,'./dist'),
            filename:'main.js'
        }
    }
    
  8. 注意:

    • package.json 文件中不可以有注释,字符串要用双引号

    • 每一次修改配置文件,都要重启webpack-dev-server

    • webpack-dev-server 打包好的main.js文件,是放在内存中的 跟目录下,看不到的,但是能用

    • 引用webpack-dev-serever打包好的 js文件: <script src="/main.js"></script>

    • 命令行运行webpack 并指定入口文件和出口文件:webpack .\src\main.js -o .\dist\main.js(不推荐)

    • webpack-dev-server 安装时,不支持全局安装

    • plugins 插件后面会提到

  9. 总结:运行webpack直接打包 和 使用webpack-dev-serever 工具打包的区别

    webpackwebpack-dev-server
    运行方式webpacknpm run dev
    入口文件默认是src 下的index.js 问件默认是src 下的index.js文件
    出口文件默认自动新建一个目录dist并把生成的main.js 文件默认是在 内存中,根目录 / main.js
    使用方法src="…/dist/main.js"src="/main.js"


webpack 中的loader

为什么要使用loader

  1. 下面就是webpack文档的解释

    loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)。loader 可以将所有类型的文件转换为 webpack 能够处理的有效模块,然后你就可以利用 webpack 的打包能力,对它们进行处理。

  2. 简单来说,webpack 只能理解低级的javaScript ,loader 可以将webpack 不理解的文件,翻译好再给webpack打包

处理样式文件 的 loader

使用.css 文件
  1. webpack处理不了.css文件所以我们需要手动安装一些合适的第三方加载器

  2. 安装 安装style-loader 和 css-loader

    cnpm i style-loader css-loader -D
    
  3. 配置

    //这是webpack.config.js 配置文件
     module:{// 这个节点,用于配置 所有的第三方模块  加载器
          rules:[//所有第三方模块的 匹配规则  
         	  // 处理.css 文件
              {test:/\.css$/,use:['style-loader','css-loader']}
          ]
    }
    
  4. 使用

    // css目录下,新建一个style.css 文件,并写入样式
    h1{
          color:red; /* 字体颜色:红色*/
    }
         
    // 在main.js 中导入css样式文件
    import './css/style.css'
    
  5. 这样,引用<script src="/main.js"></script>,的HTML页面,H1标签都有了.css样式了

使用.scss 文件
  1. webpack处理不了.scss文件所以我们需要手动安装一些合适的第三方加载器

  2. 安装 sass-loader 和 node-sass (node-sass 是sass-loader 的内部依赖)

    cnpm i sass-loader node-sass -D
    
  3. 配置

    //这是webpack.config.js 配置文件
    
    module:{// 这个节点,用于配置 所有的第三方模块  加载器
          rules:[//所有第三方模块的 匹配规则  
    		  // 处理scss 文件
              {test:/\.scss$/,use:['style-loader','css-loader','sass-loader']},
          ]
    }
    
  4. 使用

    // css目录下,新建一个style.css 文件,并写入样式
    H1{
     font-style: italic;    //字体样式:斜体
    }
    
    // 在main.js 中导入scss样式文件
    import './css/style.scss'
    
  5. 这样,引用<script src="/main.js"></script>,的HTML页面,H1标签都有了.scss样式了

使用.less 文件
  1. webpack处理不了.scss文件所以我们需要手动安装一些合适的第三方加载器

  2. 安装

    // 有的教材说还要安装==》 cnpm i less -D   // less 是less-loader 的内部依赖文件
    // 亲测 只安装less-loader 也可以用
    cnpm i less-loader -D
    
  3. 配置

    //这是webpack.config.js 配置文件
    
    module:{// 这个节点,用于配置 所有的第三方模块  加载器
          rules:[//所有第三方模块的 匹配规则  
               // 处理.less 文件
              {test:/\.less$/,use:['style-loader','css-loader','less-loader']}
          ]
    }
    
  4. 使用

    // css目录下,新建一个style.less 文件,并写入样式
    h1{
        font-size: 18px;  // 字体大小:斜体
    }
    
    // 在main.js 中导入css样式文件
    import './css/style.less'
    
  5. 这样,引用<script src="/main.js"></script>,的HTML页面,H1标签都有了.less样式了

webpack中url-loader 的使用 处理图片和字体图标

  1. webpack 默认是无法处理css文件中的 url地址,不管是图片和还是字体库,只要是用URL 都处理不了

  2. 安装配置 url-loader

    //安装
    cnpm i url-loader file-loader -D
    //配置
    module:{// 这个节点,用于配置 所有的第三方模块  加载器
            rules:[//所有第三方模块的 匹配规则  
                {test:/\.(jpg|png|gif|bmp|jpeg)$/,use:'url-loader'},//处理图片 URL
                {test:/\.(ttf|eot|svg|woff|woff2)$/,use:'url-loader'}// 处理字体图标
            ]     
        }
    
  3. 使用

    // 在 css 文件中,设置div的背景图片
    div{
        background-image: url(../image/1.jpg);
        height: 1000px;
    }
    
  4. 这样,引用<script src="/main.js"></script>,的HTML页面,div标签都有了背景图片了

处理高级JS文件的 babel-loader

  1. babel 的中文文档:https://babel.docschina.org/docs/en/

  2. 什么是Babel?下面Babel 文档解释:

    Babel 是一个 JavaScript 编译器

    Babel 是一个工具链,主要用于在旧的浏览器或环境中将 ECMAScript 2015+ 代码转换为向后兼容版本的 JavaScript 代码:

    • 转换语法
    • Polyfill 实现目标环境中缺少的功能 (通过 @babel/polyfill)
    • 源代码转换 (codemods)
  3. 简单来说,就是把高级的javaScript 语法,转换为低级的,浏览器都支持的语法。

  4. 安装

    cnpm i babel-preset-env babel-preset-stage-0 -D
    cnpm i babel-core babel-loader babel-plugin-transform-runtime -D
    
  5. 配置第一步:在webpack.config.js 文件中

    //这是webpack.config.js 配置文件
    
    module:{// 这个节点,用于配置 所有的第三方模块  加载器
          rules:[//所有第三方模块的 匹配规则  
              //处理babel 处理高级JS 文件
              {test:/\.js$/,use:'babel-loader',exclude:/node_modules/}
          ]
    }
    
  6. 配置第二步:添加 .babelrc 配置文件,和src 同级

    // 这是.babelrc 配置文件
    {
        "presets":["env","stage-0"],
        "plugins":["transform-runtime"]
    }
    
  7. 注意

    • babel-loader 和core-loader版本不对应问题

      babel-loader 8.x对应 babel-core 7.x
      babel-loader 7.x对应 babel-core 6.x
      
      cnpm i  babel-loader@7.1.5  -D//如果版本不对应,可以降低babel-loader的版本
      
    • babel-preset-env,是比较新的ES6语法,他包含了所有和ES*相关的语法

    • babel 的文档说,babel 可以把箭头函数转换成普通的函数,这样浏览器,就可以用了,我发现不用babel 浏览器也可以解析箭头函数(千万别和我一样,现在的高版本浏览器都可以解析ES6语法,不要太惊讶,也不要花时间测试)



webpack中的plugins

为什么要使用插件

  1. 官方文档解释

    loader 被用于转换某些类型的模块,而插件则可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量。插件接口功能极其强大,可以用来处理各种各样的任务。

  2. 官方文档解释

    webpack 有着丰富的插件接口(rich plugin interface)。webpack 自身的多数功能都使用这个插件接口。这个插件接口使 webpack 变得极其灵活

  3. 简单的说:webpack 的插件可以用来处理各种各样的任务,webpack 有着丰富的插件接口,插件接口使 webpack 变得极其灵活

常用的两个插件

  1. 介绍几个插件,体验一下插件的灵活
  2. HotModuleReplacementPlugin ===> webpack的内置模块 (配置和HtmlWebpackPlugin一样,不展开来讲)
  3. HtmlWebpackPlugin ====> 第三方 webpack 模块
HtmlWebpackPlugin
  1. 这个插件可以帮你生成一.html 文件,在这个文件里,已经帮你引用了.css 和.js 文件

  2. 安装

    cnpm i html-webpack-plugin -D
    
  3. 配置,插件的配置,都是在先导入插件,然后再配置,

    const path = require('path')
    
    // 启动热更新第二步:导入webpack ,因为hot热更新的插件是webpack 的内置模块
    const webpack = require('webpack')
    
    //导入html-webpack-plugin
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    
    module.exports = {
        plugins:[// 所有的差价都是在这里配置
            new webpack.HotModuleReplacementPlugin(), // 启动热更新第三步: 
            new HtmlWebpackPlugin({
                template:path.join(__dirname,'./src/index.html'), // 打包生成哪个文件
                filename:'index.html' // 生成文件的名称
            }) 
        ]
    }
    
  4. 注意:

    • template: template:path.join(__dirname,’./src/index.html’)==> 要打包哪个文件

    • filename:‘index.html’ ===> 生成的文件的名称

    • 如果不设置template和filename,那么会默认把src 下的index.html 在dist生成index.htm

      webpack 运行方式webpackenpm run dev
      不设置 template,filenam会再dist 下生成index.html不知道生成在哪里
      设置template 不设置 filename会再dist 下生成index.htmlsrc /index.html,内存中,我们看不见
    • 访问dist下的index.html:http://localhost:3001/dist/

    • 生成的文件,已经帮我们引用好了 js 文件和 css 文件,(可以在浏览器 F12 检查你的代码)

配置文件总结

  1. package.json

    {
      "name": "webpack_test",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",
        "dev": "webpack-dev-server",
        "dev1": "webpack-dev-server --open --port 3001 --contentBase src --hot"
      },
      "keywords": [],
      "author": "",
      "license": "ISC",
      "devDependencies": {
        "babel-core": "^6.26.3",
        "babel-loader": "^7.1.5",
        "babel-plugin-transform-runtime": "^6.23.0",
        "babel-preset-env": "^1.7.0",
        "babel-preset-stage-0": "^6.24.1",
        "css-loader": "^4.2.0",
        "file-loader": "^6.0.0",
        "html-webpack-plugin": "^4.3.0",
        "less-loader": "^6.2.0",
        "node-sass": "^4.14.1",
        "sass-loader": "^9.0.2",
        "style-loader": "^1.2.1",
        "url-loader": "^4.1.0",
        "webpack": "^4.44.1",
        "webpack-cli": "^3.3.12",
        "webpack-dev-server": "^3.11.0"
      }
    }
    
    
  2. webpack.config.js

    const path = require('path')
    
    // 启动热更新第二步:导入webpack ,因为hot热更新的插件是webpack 的内置模块
    const webpack = require('webpack')
    
    //导入html-webpack-plugin
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    
    module.exports = {
        // mode:"development", //  production  生产模式/开发模式
        entry:path.join(__dirname,'./src/index.js'),
        output:{
            path:path.join(__dirname,'./dist'),
            filename:'main.js'
        },
        devServer:{        // 配置webpack-dev-server
            open:true,   // 打开浏览器
            port:3001,    // 端口号
            contentBase:'src',  //访问的路径
            hot:true        //启动热更新第一步
        },
        module:{
          rules:[// 这个节点,用于配置 所有的第三方模块  加载器
              {test:/\.css$/,use:['style-loader','css-loader']}, // 处理.css 文件
              {test:/\.scss$/,use:['style-loader','css-loader','sass-loader']},// 处理scss 文件
              {test:/\.less$/,use:['style-loader','css-loader','less-loader']},// 处理.less 文件
              {test:/\.js$/,use:'babel-loader',exclude:/node_modules/},//处理js文件
              {test:/\.(jpg|png|gif|bmp|jpeg)$/,use:'url-loader'},//处理图片 URL
              {test:/\.(ttf|eot|svg|woff|woff2)$/,use:'url-loader'}// 处理图标
          ]
        },
        plugins:[
            new webpack.HotModuleReplacementPlugin(), // 启动热更新第三步: 
            new HtmlWebpackPlugin({
                template:path.join(__dirname,'./src/index.html'),// 哪个文件生成在内存中
                filename:'index.html'  // 生成的文件的名称
            }) 
        ]
    }
    
  3. .babelrc

    {
        "presets":["env","stage-0"],
        "plugins":["transform-runtime"]
    }
    
  4. index.js 文件

    // 这是入口文件
      console.log("ok");
      import './css/style.css'
      import './css/style.scss'
      import './css/style.less'
    
  5. 感谢能看到最后的朋友,祝你也能成功搭建自己的webpack 项目

中文文档

  1. webpack的中文文档:https://www.webpackjs.com/
  2. babel 的中文文档:https://babel.docschina.org/docs/en/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值