webpack搭建基本项目

发布时间 2023-11-17 16:53:50作者: 忙着可爱呀~

(webpack中文地址:https://www.webpackjs.com/loaders/)

1、第一步:新建一个空文件夹 (此处以 webpacktwotest文件夹、vscode编辑器为例)

2、第二步:安装

  1)在编辑器中打开文件夹(webpacktwotest  打开命令行快捷键Ctrl+~)

  2)执行 npm -v (查看是否安装npm)

  

  3) 安装webpack

  

  npm install -g webpack(全局安装 推荐)

  npm install --save-dev webpack(局部安装 => 当前文件夹下安装 => webpacktwotest)

  4)安装webpack -cli

  

  webpack4.0版本前不用安装,webpack4.0版本后需要安装;若不安装 在步骤三时 执行webpack -v 会提示安装webpack-cli(>4.0版本)

  原因:

  <4.0版本:webpack本身和cli在一个包中

  >4.0版本:已将两者分离开来更好的管理

 5)执行webpack -v  查看webpack是否安装成功

  

 6)执行命令 npm init 创建package.json文件(主要是项目(文件夹)的一些相关信息

  

 执行命令时会问一些项目的相关信息(如:名称、作者等),若不该动默认回车即可

 7)执行命令行 npm install --save-dev webpack 在项目中安装webpack作为依赖包 => 在文件夹下生成node_modules文件夹、package-lock.json文件

3、第三步:正式创建项目

  1)在webpacktwotest文件夹下创建 app文件夹、public文件夹

    app文件夹:用来存放我们的原始文件(包括:原始数据、我们写的JavaScript模块)

    public文件夹:用来存放供浏览器读取的文件(包括:用webpack打包的js文件、index.html文件)

  2)在public文件夹下创建index.html(浏览器读取文件)

  

 

  3)在app文件夹下创建 index.js(作为js主入口文件)price.js(此处作为一个示例文件),

 

  4)配置文件使用webpack用以打开项目(index.html)

  1> 在根目录下新建 webpack.config.js 文件配置webpack

 

  2>  配置package.js文件,以便更快捷的执行打包任务

  

  执行命令: npm install --save-dev webpack-cli  在项目中安装webpack作为依赖包 => package.json文件中生成webpack-cli属性

  执行命令:npm start 打包代码 => 执行成功后,打开 index.html 

                 注:若脚本的名称不为start ,想要在命令行执行,则执行命令 npm run {script name}  如:start 换位 build 则执行命令 npm run build(为了方便看到效果,此处将 text = “使用 build 打包代码”)

 

  注:为了表明此时项目的开发处于环境,应在webpack.config.js中配置mode => development 、production或者none

  

 

 

  注:以上步骤使用webpack便搭建好了项目,现在就可以直接编写代码生成页面了; 若果你觉得还不够,请往下接着看 webpack 其它强大的功能

 

 4、webpack的强大功能

 1> 生成 Source Maps(使调试更容易)

  有的时候调试不容易找到报错的位置,而  Source Maps 却可以使你直接找到报错地址

  通过简单的配置,webpack 就可以打包时为我们生成 Source Maps,使编译后的代码可读性更高,调试更容易

  在 webpack 配置文件中配置 Source Maps 需要配置 devtool ,有一下四种不同的配置选项

   

  上表:由上到下,打包速度越来越快,负面作用越来越多, 

  配置webpack:

 

  2> 使用webpack构建本地服务器

  构建本地服务器后,浏览器会监听代码的修改,并自动刷新页面显示修改后的结果,webpack提供一个可选的本地开发服务器,这个本地服务器基于node.js构建,可以实现你想要的功能,不过他是一个单独的文件,在webpack中进行配置之前需要单独安装它作为项目依赖

  1》执行命令 npm install --save-dev webpack-dev-server 作为项目依赖 ,package.json生成 webpack-dev-server 属性

  2》在webpack.config.js 文件中配置devserver

  

  

  3》启动本地服务器

  在package.json中 scripts 对象添加 server属性

  

  4》查看结果 执行命令 npm run server  ,执行成功后,只要修改代码,页面便会实时更新

  

 

  注:在写完代码后记得跑下代码 (执行命令:npm start 或 npm run build,将代码打包进 输出文件)

   3> 创建 Babel

   Babel作为编译JavaScript的平台(转译 >ES6js,相当于一个转译器),其实是一个模块化的包,可以使你:

    。使用最新的JavaScript代码(ES6、ES7...),而不用考虑是否被当前浏览器支持

    。使用基于JavaScript进行拓展的语言(如React 的·JSX)

    babel转译器大致分为3类:

    。语法转移器  这些转译器只负责转译 js 最新的语法,不负责转译 js新增的 API(如String新增的String.padStart) 和全局对象(如 promise);如:babel-preset-env、                                            babel-preset-es2015、babel-preset-es2016等;

    。补丁转移器  这些转移器只负责转译 js 最新的 API和全局对象;如:babel-polyfill(只是简单的把 core-js和regenerate runtime包装了下,易污染全局环境)

    。JSX和flow插件 这类插件用于转译 JSX语法和移除类型声明 如:babel-preset-react

    由于大多数人碰到过 polyfill 问题,这里简单讲一下 polyfill的几种使用方法:

      1)使用转换插件babel-plugin-transform-xxx

         使用方法:

         。缺什么即添加什么,在package.json添加所需的依赖 babel-plugin-transform-xxx

         。在 .babelrc 中的 plugins 项配置 babel-plugin-transform-xxx插件

         。代码中不需要使用require/import 引入插件, .babel 中不需要指定useBuiltIns,webpack.config.js中不需要做额外处理,一切由babel插件完成转换

        优点:

         。作用域是模块,避免全局冲突

         。按需引入,避免不必要引入造成代码臃肿

        缺点:

         。每个模块内单独引用和定义 polyfill 函数,造成了重复定义,使代码产生了冗余

       2)使用插件 babel-runtime 和 babel-plugin-transform-runtime

       使用方法:

       。package.json中添加依赖 babel-runtime 和 babel-plugin-transform-runtime

       。在 .babelrc 中的 plugins 项配置 transform-runtime 插件 

       。直接使用,无需其它额外配置

       优点:

       。无全局污染

       。依赖统一按需引入 ( polyfill 各个模块共享),无重复引入,无多余引入

       缺点:

       。由于 polyfill 对象是临时构造并被 require/import引入,对象未真正挂载到全局,无法使用实例化对象的方法(如 [].include())

       3)全局 babel-polyfill(不使用 usebuiltIns属性)

        使用方法:

         。法1:在head 标签中引入 babel-polyfill.js 

         。法2:package.json 中添加依赖 babel-polyfill,在webpack配置文件增加入口 (如:entry: ["babel-polyfill",'./app/index.js']),polyfill 将被打包进该入口文件并放在入口文件顶部

         。法3:package.json 中添加依赖 babel-polyfill,在webpack入口文件顶部使用 require/import引入

        优点:

        。一次性全局解决兼容性问题

        缺点:

        。一次引入了 ES6 + 的所有 polyfill ,打包后的js文件体积会偏大,造成流量浪费等;

        。污染全局对象,不适合框架或库的开发

        4)全局 babel-polyfill(使用 babel-preset-env 插件和 usebuiltIns属性)

         使用方法:

        。package.json中添加依赖 babel-preset-env

        。.babelrc 中的 presets 中使用 preset-env

        。指定 usebuiltIns 为true

        。指定浏览器环境或node环境,配置需要兼容的浏览器列表

        。在webpack入口文件中 使用import/require 引入 babel-polyfill

        。以上配置完成后,babel 会根据指定的浏览器兼容列表自动引入所有需要的polyfill,不管你的代码中是否使用

        优点:

        。按照指定的浏览器环境引入,一定程度上减少了不必要的 polyfill 的引入

        缺点:

        。使用方式繁杂

       注:全局方式下要保证 polyfill 在所有其他脚本之前执行

       

 

      5)polyfill.io

       根据浏览器 userAgent 自动返回合适的 polyfill 

       使用方法:

       。直接通过CDN引入

<script src="https://cdn.polyfill.io/v2/polyfill.min.js"></script>
https://c7sky.com/polyfill-io.html

 

   补充:babel 最常见配置选项

    。env 默认值为一个空对象,用于配置代码需要兼容的环境,如代码要在 e9+ 以上运行;配置代码兼容最新的 node 

    

 

      。presets 配置需要使用的转译器,由下至上调用 (如与plugins同时存在,优先使用plugins)

      

 

      。plugins 配置转译所需要的插件,由上至下调用 (与presets同时存在时,优先使用plugins)

       

       。ignore 忽略某些文件,默认值为 null ;忽略后即不转译该文件

       

      。minified 是否压缩转译后的代码,默认 false

      

      。

 

    

    1》Babel安装

    npm --save-dev babel-core   babel转译器本身,提供babel的转译API,将 js 代码转译为 AST(抽象语法树,再通过 语法转换器 分析其语法后转为低版本js),使之可以直接调                                                      用 Babel 的 API 对某些代码或者某些文件进行转译,可以用来开发自己的 babel 转移器;

    npm --save-dev babel-loader 加载Es5+代码,然后使用babel转译

    npm --save-dev babel-preset-env 将 ES5+ 代码转译为 低版本js

   2》配置 .babelrc,babel的所有配置均放置在该文件中

   

 

 

 

  终:通过以上 Babel 的配置,现在在代码中就可以使用 ES6 语法了;接下来接着说 webpack的其它功能

 

  4> loaders 使webpack有能力调用外部脚本或工具

  通过使用不同的 loader ,webpack 有能力调用外部脚本或工具,实现对不同格式文件的处理,如:scss/sass 转换为 css,或者把 ES6+ 转换为现代浏览器兼容的 js 文件,JSX转    换为 js;

  loaders 需要单独安装,并且需要在 webpack.config.js 中 modules(模块配置项) 关键字下进行配置,配置包括以下几方面

  。test 一个用以匹配 loaders 所处理文件拓展名的正则表达式(必须)

  。loader loader的名称(必须)

  。include/exclude 手动添加必须处理的文件(文件夹)或屏蔽不需要处理的文件(文件夹)(可选)

  。query 为loaders 提供额外的设置选项