项目初始化:采用TypeScript

我们的版本是:

$ node --version
v8.5.0
$ npm --version
5.5.1

npm版本升级了,因为npm最近带来了新特性,本地会生成package-lock.json,能

提高一些性能,想知道更多的,可以google一下。

创建目录初始结构:

$ mkdir pickle
$ cd pickle
$ touch index.html
$ touch index.ts
$ touch webpack.config.js

初始化package.json

$ npm init --force
Wrote to /Users/abraham/dev/pickle/package.json:
...

--force是告诉自动采用默认配置。

安装相应的包:

$ npm install --save-dev typescript ts-loader webpack http-server
+ typescript@2.5.2
+ ts-loader@2.3.7
+ webpack@3.6.0
+ http-server@0.10.0
added 394 packages in 17.115s

创建tsconfig.json文件:(这里采用本地的typescript包,你也可以全局安装)

$ ./node_modules/typescript/bin/tsc --init
message TS6071: Successfully created a tsconfig.json file.

webpack.config.js:

const path = require('path');
module.exports = {
entry: './index.ts',
module: {
rules: [
{
test: /\.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/
}
]
},
resolve: {
extensions: [ ".tsx", ".ts", ".js" ]
},
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
}
};

修改pacakge.json:

{
...
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack",
"serve": "http-server"
},
...
}

然后你跑如下命令,可以看到:

$ npm run build
> pickle@1.0.0 build /Users/abraham/dev/pickle
> webpack
ts-loader: Using typescript@2.5.2 and /Users/abraham/dev/pickle/tsconfig.json
Hash: 8b5d98f242aeda6844bb
Version: webpack 3.6.0
Time: 815ms
Asset Size Chunks Chunk Names
bundle.js 2.51 kB 0 [emitted] main
[0] ./index.ts 14 bytes {0} [built]

修改index.html:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Pickle</title>
</head>
<body>
<h1>Welcome to Pickle</h1>
<label for="color-picker">Select a new background color</label>
<input id="color-picker" type="color" value="#2196F3">
<script defer src="dist/bundle.js"></script>
</body>
</html>
class Pickle {
constructor(private picker: Element, private background: HTMLElement) {
picker.addEventListener('change', this.colorChange.bind(this), false);
this.background = background;
}
colorChange(event: Event): void {
// `<HTMLInputElement>` tells TypeScript what type `target` is so that it knows there is a `value` property available.
let input = <HTMLInputElement>event.target;
this.background.style.backgroundColor = input.value;
}
}
let picker = document.querySelector('#color-picker');
// The if avoids TypeScript complaining that `picker` might be null.
if (picker) {
new Pickle(picker, document.body);
}

然后运行:

$ npm run build
...
$ npm run serve
> http-server
Starting up http-server, serving ./
Available on:
http://127.0.0.1:8080
http://192.168.200.8:8080
Hit CTRL-C to stop the server

浏览器访问:http://127.0.0.1:8080

webpack热加载配置(修改代码,自动刷新代码)

我们的package.json的script长这样:

{
...
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack",
"serve": "http-server",
"watch": "webpack --watch"
},
...
}

运行npm run watch后是这样:

$ npm run watch
> pickle@1.0.0 watch /Users/abraham/dev/pickle
> webpack --watch
Webpack is watching the files…
ts-loader: Using typescript@2.5.3 and /Users/abraham/dev/pickle/tsconfig.json
Hash: 16fb35ccc9f9b3f14c5d
Version: webpack 3.8.1
Time: 957ms
Asset Size Chunks Chunk Names
bundle.js 3.27 kB 0 [emitted] main
[0] ./index.ts 775 bytes {0} [built]

当然我们可以直接合并命令:

{
...
"serve": "npm run watch & http-server"
...
}

然后直接运行npm run serve就行了。Webpack会自动监听和编译我们的代码。

进一步,我们希望支持Hot Module Replacement(支持模块级别的自动刷新,而不需要刷新浏览器),

需要安装如下两个东西:

$ npm install --save-dev webpack-dev-server
+ webpack-dev-server@2.9.2
added 165 packages in 10.49s
$ npm install --save-dev html-webpack-plugin
+ html-webpack-plugin@2.30.1
added 38 packages and removed 11 packages in 4.662s

修改配置webpack.config.js:

module.exports = {
...
devServer: {
contentBase: path.resolve(__dirname, '.') ,
hot: true
}
...
};

依赖它们:

const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
...

添加插件:

module.exports = {
...
plugins: [
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html'
}),
new webpack.NamedModulesPlugin(),
new webpack.HotModuleReplacementPlugin()
]
...
};

HotModuleReplacementPlugin 插件是告诉我们用热加载

NamedModulesPlugin 是用来清空编译日志的,这样只会显示我们入口文件信息。

HtmlWebpackPlugin 会把根目录的template文件(index.html),输出到dist目录的filename指定的文件名。这样webpack可以自动在index.html里面添加script标签,所以我们的index.html里面不需要: <script defer src="dist/bundle.js"></script>

修改package.json:

{
...
"serve": "webpack-dev-server --open"
...
}

--open告诉webpack在浏览器打开我们的页面。

运行npm run serve就行了。大功告成。

webpack支持source maps

修改tsconfig.json:、

{
...
"sourceMap": true,
...
}

修改webpack.config.js:

module.exports = {
...
devtool: 'eval-source-map'
};

以上就是今天的内容,不知道你学会了webpack配置,TypeScript会用了吗?

原文链接:https://bendyworks.com/blog/getting-started-with-webpack-source-maps

作者知乎/公众号:前端疯 (一群热爱前端的一线程序员维护,想要用前端改变世界。)

(译文)开始学习Webpack-应用TypeScript,配置热加载和Source Map的更多相关文章

  1. Aspnetcore下面服务器热更新与配置热加载

    原文:Aspnetcore下面服务器热更新与配置热加载 Asp.net的热更新方案Appdomain在aspnetcore中不被支持了 新的方案如下: 配置文件更新选项 reloadOnChange ...

  2. 在线配置热加载配置 go-kratos.dev 监听key

    paladin https://v1.go-kratos.dev/#/config-paladin example Service(在线配置热加载配置) # service.go type Servi ...

  3. 如何用Python实现配置热加载?

    背景 由于最近工作需求,需要在已有项目添加一个新功能,实现配置热加载的功能.所谓的配置热加载,也就是说当服务收到配置更新消息之后,我们不用重启服务就可以使用最新的配置去执行任务. 如何实现 下面我分别 ...

  4. nginx多进程模型之配置热加载---转

    http://blog.csdn.net/brainkick/article/details/7176405 前言: 服务器程序通常都会通过相应的配置文件来控制服务器的工作.很多情况下,配置文件会经常 ...

  5. springboot idea 配置热加载

    在idea 配置springboot的热加载,只需要三步: 第一步.引用jar包 <dependency> <groupId>org.springframework.boot& ...

  6. 关于在Intellij IDEA工具中配置热加载问题

    第一步,创建一个maven项目,然后在pom.xml文件中添加依赖(上图内容). 第二步:来到intellij idea主页面,点击File->Settings->Build->co ...

  7. Prometheus监控学习笔记之Prometheus如何热加载更新配置

    0x00 概述 当 Prometheus 有配置文件修改,我们可以采用 Prometheus 提供的热更新方法实现在不停服务的情况下实现配置文件的重新加载. 0x01 热更新 热更新加载方法有两种: ...

  8. idea配置热加载

    第一步:添加依赖 spring-boot项目中引入如下依赖 <dependency> <groupId>org.springframework.boot</groupId ...

  9. 打包工具webpack和热加载深入学习

    本次小编呢,为大家带来一篇深入了解打包工具 webpack. 我们今天使用的是 webpack3.8.1版本的,我们学习使用 3.8.1更稳定些,并学习自己如何配置文件,最新版本不需要自己配置文件,但 ...

随机推荐

  1. Flash Builder4.0运行应用程序报错

    1.错误描述 SecurityError: Error #2148: SWF 文件 file:///D:/Adobe Flash Builder 4 Installer/HVBox/bin-debug ...

  2. 2.3 InnoDB 体系架构

    下图简单显示了InnoDB的存储引擎的体系架构,从图可见,InnoDB储存引擎有多个内存块,可以认为这些内存块组成了一个大的内存池,负责如下工作: 维护所有进程/线程需要访问的多个内部数据结构 缓存磁 ...

  3. 异常-----freemarker.core.ParseException: Encountered

    1.错误描述 freemarker.core.ParseException: Encountered " " at line 14, column 12 in myself.ftl ...

  4. jquery 获取上传图片的大小(或者本张图片的其它属性)

    <input type="file" name="upload" style="display:none;" src="${ ...

  5. 【原】从零开始改造淘淘商城(引入dubbo解决项目耦合)02

    前言: 关于为什么要引入dubbo框架,而不是用spring cloud或者是motan呢,主要是笔者现在公司用的就是dubbo,并且第一次接触到微服务的概念是来源于dubbo,再加上最近dubbo频 ...

  6. C#技术点--修改系统时间

    C#的System.DateTime类提供了对日期时间的封装,用它进行时间的转换和处理很方便,但是我没有在其中找到任何可以用来修改系统时间的成员.用过VC.VB等的朋友可能知道,我们可以调用Win32 ...

  7. 【BZOJ4569】萌萌哒(并查集,倍增)

    [BZOJ4569]萌萌哒(并查集,倍增) 题面 BZOJ 题意: 有一个长度为\(n\)的数 给定\(m\)个限制条件 每次限制\(l1-r1\)与\(l2-r2\)是相同的 求出方案数 题解 如果 ...

  8. xctf的一道题目(77777)

    这次比赛我没有参加,这是结束之后才做的题目 题目链接http://47.97.168.223:23333 根据题目信息,我们要update那个points值,那就是有很大可能这道题目是一个sql注入的 ...

  9. MySQL单表百万数据记录分页性能优化,转载

    背景: 自己的一个网站,由于单表的数据记录高达了一百万条,造成数据访问很慢,Google分析的后台经常报告超时,尤其是页码大的页面更是慢的不行. 测试环境: 先让我们熟悉下基本的sql语句,来查看下我 ...

  10. C++学习-7

    1.面向过程是:数据与操作分离,数据容易被意外修改 2.面向过程通过私有化的权限进行数据封装 3.类型后辍:类名 operator "" _XXXX(int data)  增加后缀 ...