webpack学习一

2020-07-10  本文已影响0人  梦行乌托邦

webpack v4.x.x

一、安装

新建一个项目webpack_day1,先初始化:

npm init -y

这样项目下就多了一个package.json文件

{
  "name": "webpack_day1",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

然后执行以下命令局部安装webpack

npm i webpack webpack-cli -D

不建议全局安装,因为全局安装会把所有项目指定到指定的版本,这样可能造成一些问题。
安装完成之后,你想看看webpack的版本,如果你执行以下命令

webpack -v

会报错,这种只适用于webpack的全局安装。应该用如下命令:

npx webpack -v

二、运行

在webpack_day1项目下新建src目录,再新建一个index.js文件,内容如下:

console.log('hello webpack');

在命令行执行

npx webpack

现在项目下多了一个dist目录,里面有一个main.js文件,内容如下:

!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t){console.log("hello webpack")}]);

或者有另外一种运行方式
修改package.json中的配置

"scripts": {
    "test": "webpack"
  },

命令行执行

npm run test

也会打包出一个dist目录中的main.js

三、js引入页面

在dist目录下创建一个index.html,通过script标签引入main.js,在浏览器打开index.html,发现控制台打印出了“hello webpack”。
以上都还只是用到了webpack的默认配置

webpack默认配置

  • 默认入口模块 /src/index.js
  • 默认输出
    • /dist
    • /dist/main.js
  • webpack默认支持多种模块类型,如CommonJS、ESmodule、AMD
  • webpack默认支持js模块和json模块

在src目录下新建index.json

{
    "name": "test"
}

在src目录下新建other.js

export function add(a, b){
    return a + b;
}

修改index.js

import {add} from './other.js';
const json = require('./index.json');

console.log(add(1, 2), json);

打包运行,在浏览器查看,有正常运行并打印结果到控制台

那么,非js或json的文件导入会怎么样呢?
在index.js中新增一句

import('./logo.png');

运行,报错,提示需要配置一个相应的loader

四、配置

在项目根目录下新建一个默认的配置文件webpack.config.js。
因为webpack是基于nodejs的,所以导出对象要用CommonJS规范
以下都是默认配置

const path = require('path');

module.exports = {
    entry: './src/index.js', // webpack执行入口
    output: {
        path: path.resolve(__dirname, './dist'), // 输出到哪里,必须是绝对路径
        filename: 'main.js'
    }
};

运行提示没有配置mode,加上

const path = require('path');

module.exports = {
    entry: './src/index.js', // webpack执行入口
    output: {
        path: path.resolve(__dirname, './dist'), // 输出到哪里,必须是绝对路径
        filename: 'main.js'
    },
    mode: 'development'
};

再运行,这时候生成的main.js就不是压缩的了,因为是开发模式。
为什么生成的main.js文件内容远多于我们自己写的呢?
这里面主要加了启动器自执行函数,参数是入口及其依赖的所有模块。

所以,webpack不适合用于JS库的构建,因为不够纯粹!

上一篇下一篇

猜你喜欢

热点阅读