webpack实践(一)- 先入个门

webpack系列博客中代码均在github上:https://github.com/JEmbrace/webpack-practice
《webpack实践(三)- html-webpack-plugin》
《webpack实践(四)- html-webpack-plugin》
一.前言
webpack是个啥呢?看官网的这段描述。
webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)
   在我以前做纯html、css、js(jQuery)开发的时候,我看了这句话之后的感受就是  
先不管它是个啥了吧,心里把上面的那段描述默念3遍,就开始干活吧
二.准备工作和说明
1.本文档不包含node的安装和配置说明,因此安装webpack时需要确保电脑已正常安装node且可以正常运行npm命令。
2.本次安装和示例均基于webpack 4.x版本,不同webpack版本直接存在差异,若存在问题,请先检查webpack版本是否一致。
3.window 10 环境,命令行使用的是windows的PowerShell。
三.安装
1.创建项目目录
在E:\MyStudy\下创建目录 webpackPractice
  
2.初始化目录
打开cmd命令行,使用npm init初始化目录
  
初始化完成后,根目录下会生成一个package.json文件
  
查看一下package.json文件的内容
  
可以看到该文件的内容就是我们在使用npm init 初始化项目的时候交互式命令输入的内容。
3.局部安装webpack
安装webpack需要在项目根目录下分别按照webpack和webpcak-cli。
备注:webpack4中,webpack和webpack-cli两个包是分开的,因此两个必须都同时安装。如果只安装了webpack,运行打包命令时会提示你需要安装webpack-cli。

  
(也可以直接使用npm install webpack webpack-cli --save-dev一次安装到位)
安装完成后,我们在看下生成的文件和package.json的变化
  
安装完成,我们测试一下是否安装成功:在项目根目录下执行webpack命令
  
emmmmm,这个错误提示webpack命令无法运行。其实原因也很简单,我们是局部安装webpack,webpack可执行的windows命令脚本在【E:\MyStudy\webpackPractice\node_modules\.bin】目录下:
  
注意:windows PowerShell命令行工具运行的脚本是以.ps1结尾的webpack.ps1。以.cmd结尾的是window cmd命令行可运行的脚本
所以想要webpack命令可正常执行,第一种办法就是换到该目录下,这种办法亲测可用,只是后续打包指定目标文件时会存在一些文件路径设置的问题,所以这种办法不推荐。
第二种方法呢,就是将【E:\MyStudy\webpackPractice\node_modules\.bin】添加到path环境变量中,这里偷个懒就不演示了。添加完成后在执行webpack命令:
  
无法加载webpack.ps1(这个提示也验证了前面的说法:powershell运行的脚本是webpack.ps1)这个又是什么妖怪,按照错误提示访问了链接https://go.microsoft.com/fwlink/?LinkId=135170,看了下文档发现是因为PowerShell处于安全考虑对执行脚本做了限制。然后搜罗了一番找到了解决办法:在PowerShell中执行Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope LocalMachine(具体是啥意思也不是很清楚,总之就是放开这个不能执行脚本的限制)。
然后在执行webpack这个命令:
  
  成功!!!
四.来打包一个文件吧
到现在我们按照好了webpack的环境,然而还是不知道webpack是个what,没关系,我们继续可以带着这个疑问继续往下看。
我们先使用webpack打包一个简单的文件。
1.第一步:先创建一个index.js文件
  
2.第二步:在index.js中写入代码
function helloWebpack(){
    alert('hello,webpack!');
}
helloWebpack();
3.第三步:打包index.js文件
  
可以看到我们的打包命令为:webpack index.js -o index.bundle.js --mode=development
我们分两部分简单解释一下这个命令。
第一部分:webpack index.js -o index.bundle.js
index.js表示我们打包的入口文件,本次我们只有一个js文件,因此直接指定为index.js
-o 表示输出信息,后面紧接着的参数为要输出的文件路径和文件名,这里我们指定为index.bundle.js
备注:关于命令行接口的用法可点此传送至官方文档
第二部分:--mode=development
使用--mode可以指定webpack使用那种模式去做内置优化。
为了方便看清楚打包后的内容,我们本次打包指定的模式为开发模式
备注:关于模式的内容可点此传送至官方文档
打包完成后,可以看到项目根目录下生成了一个index.bundle.js文件
  
我们看一下这个index.bundle.js文件的内容(如果打包时模式指定的是production,则函数命令、变量命令均会简化,文件以压缩在一行展示)
/******/ (function(modules) { // webpackBootstrap
/******/     // The module cache
/******/     var installedModules = {};
/******/
/******/     // The require function
/******/     function __webpack_require__(moduleId) {
/******/
/******/         // Check if module is in cache
/******/         if(installedModules[moduleId]) {
/******/             return installedModules[moduleId].exports;
/******/         }
/******/         // Create a new module (and put it into the cache)
/******/         var module = installedModules[moduleId] = {
/******/             i: moduleId,
/******/             l: false,
/******/             exports: {}
/******/         };
/******/
/******/         // Execute the module function
/******/         modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/         // Flag the module as loaded
/******/         module.l = true;
/******/
/******/         // Return the exports of the module
/******/         return module.exports;
/******/     }
/******/
/******/
/******/     // expose the modules object (__webpack_modules__)
/******/     __webpack_require__.m = modules;
/******/
/******/     // expose the module cache
/******/     __webpack_require__.c = installedModules;
/******/
/******/     // define getter function for harmony exports
/******/     __webpack_require__.d = function(exports, name, getter) {
/******/         if(!__webpack_require__.o(exports, name)) {
/******/             Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/         }
/******/     };
/******/
/******/     // define __esModule on exports
/******/     __webpack_require__.r = function(exports) {
/******/         if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/             Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/         }
/******/         Object.defineProperty(exports, '__esModule', { value: true });
/******/     };
/******/
/******/     // create a fake namespace object
/******/     // mode & 1: value is a module id, require it
/******/     // mode & 2: merge all properties of value into the ns
/******/     // mode & 4: return value when already ns object
/******/     // mode & 8|1: behave like require
/******/     __webpack_require__.t = function(value, mode) {
/******/         if(mode & 1) value = __webpack_require__(value);
/******/         if(mode & 8) return value;
/******/         if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/         var ns = Object.create(null);
/******/         __webpack_require__.r(ns);
/******/         Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/         if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/         return ns;
/******/     };
/******/
/******/     // getDefaultExport function for compatibility with non-harmony modules
/******/     __webpack_require__.n = function(module) {
/******/         var getter = module && module.__esModule ?
/******/             function getDefault() { return module['default']; } :
/******/             function getModuleExports() { return module; };
/******/         __webpack_require__.d(getter, 'a', getter);
/******/         return getter;
/******/     };
/******/
/******/     // Object.prototype.hasOwnProperty.call
/******/     __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/     // __webpack_public_path__
/******/     __webpack_require__.p = "";
/******/
/******/
/******/     // Load entry module and return exports
/******/     return __webpack_require__(__webpack_require__.s = "./index.js");
/******/ })
/************************************************************************/
/******/ ({
/***/ "./index.js":
/*!******************!*\
  !*** ./index.js ***!
  \******************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("function helloWebpack(){\r\n\talert('hello,webpack!');\r\n}\r\nhelloWebpack();\n\n//# sourceURL=webpack:///./index.js?");
/***/ })
/******/ });
我们可以看到打包后的文件内容和源文件差异很大,只有最后几行的内容和源文件内容相关。不过现在还没有必要研究打包后的文件内容都是什么意思。
我们都知道index.js文件如果被一个html引用,则会弹窗提示hello,webpack。那我们尝试将打包后的index.bundle.js引入一个html文件中,看下会有什么结果。
4.第四步:将打包后的index.bundle.js引入html页面中
首先我们得新建一个index.html
  
在index.html编写代码并将index.bundle.js引入
<html>
<head>
<meta charset="utf-8" />
<script src='index.bundle.js'></script>
</head>
<body>
<h1>先入个门</h1>
</body>
</html>
我们使用浏览器打开index.html,查看结果
  
五.总结
到此,关于webpack的简单入门就结束了。
我们演示了webpack的安装,并使用webpack提供的cli打包一个简单的index.js文件,对于最后的index.js仅仅是一个演示,实际项目中并不会有这样的情况和操作。
后续我们会边总结边往实际项目中去应用。
  

webpack实践(一)- 先入个门的更多相关文章
- webpack实践(三)- html-webpack-plugin
		webpack系列博客中代码均在github上:https://github.com/JEmbrace/webpack-practice <webpack实践(一)- 先入个门> < ... 
- webpack实践(二)- webpack配置文件
		webpack系列博客中代码均在github上:https://github.com/JEmbrace/webpack-practice <webpack实践(一)- 先入个门> < ... 
- webpack实践(四)- html-webpack-plugin
		webpack系列博客中代码均在github上:https://github.com/JEmbrace/webpack-practice <webpack实践(一)- 先入个门> < ... 
- webpack实践总结
		一.Loader写法及执行顺序 从webpack2起,loader的格式如下: module: { rules: [ {test: /\.css$/, use: ['style-loader','cs ... 
- npm scripts + webpack 实践经验(React、Nodejs)
		最近用Webpack+npm scripts+Mongodb+Nodejs+React写了个后台项目,在用Webpack构建过程中遇到了许多坑,就写出来分享一下. 构建工具五花八门,想当年刚学会Gru ... 
- vue+webpack实践
		最近使用了vue来做SPA应用,记一波学习笔记. 使用vue+webpack实现前端模块化. vuejs——轻量.学习成本低.双向绑定.无dom的操作.组件的形式编写 推荐官方文档 vue.js官方文 ... 
- webpack实践笔记
		1)cross-env 能跨平台地设置及使用环境变量 大多数情况下,在windows平台下使用类似于: NODE_ENV=production的命令行指令会卡住,windows平台与POSIX在使用命 ... 
- webpack实践——DLLPlugin 和 DLLReferencePlugin的使用
		DLLPlugin 和 DLLReferencePlugin的使用 DLLPlugin 和 DLLReferencePlugin 用某种方法实现了拆分 bundles,同时还大大提升了构建的速度. 1 ... 
- 【xinsir】webpack实践
		webpack现在是前端必会的技能了,也是在工作中必定用到的.所以,如果我们现在还不会webpack,那么在将来面试中肯定会被扣分的. webpack中文官网:https://www.webpackj ... 
随机推荐
- InfluxDB 聚合函数实用案例
			InfluxDB 聚合函数实用案例 文章大纲 InfluxDB 简介 InfluxDB是GO语言编写的分布式时间序列化数据库,非常适合对数据(跟随时间变化而变化的数据)的跟踪.监控和分析.在我们的项目 ... 
- 交叉编译sqlcipher
			1. 小心预编译宏SQLITE_HAS_CODEC 2. openssl在不同License下,导出的符号不对等.(错了,1.1.0后api发生变化,小心选用openssl版本) 3, ac使用了li ... 
- ubuntu 16.04上源码编译opengv | compile opengv on ubuntu 16.04
			本文首发于个人博客https://kezunlin.me/post/1e5d14ee/,欢迎阅读! compile opengv on ubuntu 16.04 Series compile open ... 
- .NET高级特性-Emit(2.1)字段
			在上篇blog写完的几天后,有读者反映写的过于复杂,导致无法有效的进行实践:博主在考虑到园子里程序员水平高低不一致的情况,所以打算放慢脚步,对类的一些内容进行详细的讲解,顺带的会写一些笔者所遇到过的E ... 
- JavaScript笔记八
			1.原型(prototype) - 创建一个函数以后,解析器都会默认在函数中添加一个数prototype prototype属性指向的是一个对象,这个对象我们称为原型对象. - 当函数作为构造函数使用 ... 
- Base系列编码浅析【base16   base32   base64   base85  base36  base 58  base91  base 92   base62】
			Base系列编码浅析 [base16 base32 base64 base85 base36 base 58 base91 base 92 base62] base编码 ... 
- VS Code实现markdown画流程图
			安装最新的vscode编辑器,原生支持markdown语法.不会markdow的人可以去好好学下,写文档神器!!! 1.安装Markdown Preview Enhanced插件 2.本地新建test ... 
- Netty网络框架
			Netty网络框架 Netty是一个异步的基于事件驱动的网络框架. 为什么要使用Netty而不直接使用JAVA中的NIO 1.Netty支持三种IO模型同时支持三种Reactor模式. 2.Netty ... 
- Chrom谷歌浏览器没网之最全解决办法之一
			一开始查找百度很多方法都不行,,第一次尝试.最有希望和看着像的是:1.win+r --> 输入regedit 打开注册表2.打开目录HKEY_CURRENT_USER\Software\Micr ... 
- P2669 金币
			题目描述 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天),每天收到两枚金币:之后三天(第四.五.六天),每天收到三枚金币:之后四天(第七.八.九.十天),每 ... 
