webpack实战总结2.0

package.json

husky

husky可以让我们向项目中方便添加git hooks。通常情况下我只需要如下两步就可在项目中引入并设置好husky

"husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },

nodemodule

我们需要区分npm包里的公共接口和它的私有实现,只有main文件(默认是index.js)里export出来的模块是公共模块,其他文件导出的模块我们都认为是内部私有实现,不应该被外界使用,所以:

对于npm 包的提供方,应该只把main文件当做大家会使用的公共模块,没有在这个文件里出现的模块,应该认为大家都不会使用
对于npm包的使用者,应该只通过import整个包的方式(如import { nm } ‘@ xc/math’),引用其中的内容,避免使用深层路径引用的方式(如import nm from ‘@ xc/math/nm’)

Babel

JavaScript编译器,从项目根目录下的. babelrc中读取配置
下载插件以及对应依赖模块,一个plugin接入preset列出使用的新语法

例子:
ES6的class用ES5的prototype实现
为新的API注入polyfill,例如fetch API

typescript

全局安装typescript 之后,携带安装编译器tsc
tsc h.ts命令编译出. js文件和js.map文件
tsconfig. json
集成到webpack(方法之一)
loader(module)
extensions增加ts后缀

源码转换有文件合并的过程,所有内部变量都改了名字=>js.map文件记录位置信息,转换后的代码的每一个位置,所对应的转换前的位置。
有了它,出错的时候,除错工具将直接显示原始代码,而不是转换后的代码。这无疑给开发者带来了很大方便。

scss

Scss 是 Sass 3 引入新的语法,Scss就是Sass的升级版,其语法完全兼容 CSS3,并且继承了 Sass 的强大功能。

#sidebar
width: 30%
background-color: #faa
#sidebar {width: 30%; background-color: #faa}

scss语法类似css, sass语法类似ruby
scss官方提供了多种编译器,将其编译成在浏览器环境下运行的css,例如node-sass
C++编写,再用node封装

集成到webpack(方法之一)
sass-loader(module)和css-loader(导入语句,CSS module,压缩css)和style-loader(JavaScript注入样式)

postCSS

postCSS css处理工具, JavaScript编写,运行在node上,配置文件postcss.config.js。

可以通过插件机制扩展自己的功能,更灵活
自动添加前缀,适配各浏览器
使用下一代css语法
集成到webpack(方法之一)postcss-loader

React

Babel和Typescript都提供了支持

Babel导入React

1、两者都需要先安装react、react-dom
Babel原生不支持JSX语法,还需要安装新的依赖babel-preset-react
修改. babelrc,加入

"presets": ["@babel/preset-react"]

然后就可以使用了

import * as React from 'react';
import { Component } from 'react';
import { render } from 'react-dom';
class Button extends Component {
	render(){
		return <h1>hello</h1>
	}
	render(<Button/>,window.document.getElementById('app'));
}

Typescrip导入React

1、两者都需要先安装react、react-dom
Typescrip原生支持JSX语法,不需要安装新的依赖,只需要在tsconfig.json中添加

{
	‘compilerOptions’ :{
	 	'jsx':'react'
	}
}

使用了jsx语法的文件后缀必须是tsx
webpack.config.js

resolve: {
	extensions: [ '.ts','.tsx','.js' ]
}

vue

Babel导入vue

vue一般通过babel集成
vue-loader:解析 .vue文件,提取出其中的逻辑代码script、style、template并把他们交给对应的loader
css-loader、vue-template-compiler

使用typescript编写vue

vue从2.5.0版本开始就提供了对typescript的良好支持

为单页应用生成HTML

只输出了一个 bundle.js 文件,所以可以通过模板文件生成

模板文件语法

模板文件:描述哪些资源需要以某种方式加入到输出的HTML文件中

.tpl文件,实质是一个函数

//变量使用
{$foo={counter}+3}                  // 标签内的标签

//注释
{* 我是一个Smarty的注释, 显示输出时我不会存在  *}

//函数使用
{include file="header.tpl"}

EJS是一个简单高效的js模板,用来生成html标签。可以说EJS是一个JavaScript库,EJS可以同时运行在客户端和服务器端,客户端安装直接引入文件即可,服务器端用npm包安装

EJS常用标签
<% %>流程控制标签
<%= %>输出标签(原文输出HTML标签)
<%- %>输出标签(HTML会被浏览器解析)
<%# %>注释标签
% 对标记进行转义
<link rel='stylesheet' href='app?_inline'>

url字符串可以分为两部分,例如:
app?_inline
前面的app表示CSS代码来自名叫app的chunk
后面的 inline表示这些代码需要被内嵌到这个标签所在的位置

除了_inline还支持
_dist 只有生产环境下引入该资源
_dev 只有开发环境下引入该资源
_ie 只有ie浏览器下引入该资源

配置模板文件

webpack.config.js

plugins:[
   // 一个webPlugin对应一个HTML文件
   new WebPlugin({
	    template:'HTML模板文件所在路径', 
	    filename:'index.html' // 输出HTML的文件名称
  }),
   new ExtractTextPlugin({
   		filename:`[name]_[coontenthash:8].css`, // 为输出的CSS文件名称加入Hash值
   }),

   // 定义环境变量
   new DefinePlugin({
	   'process.env':{
	        // NODE_ENV定义为production,以去除源码中只有开发时才需要的部分
	   		NODE_ENV:JSON.stringify('production')
	   }
   }),

 // 压缩代码输出
   new UglifyJsPlugin({
   		// 最近凑的输出
   		beautify: false,
   		// 删除注释
   		comments: false,
   		// 具体压缩操作的配置
   		compress: {
   			warnings:false, // 删除没有用到的代码时候不输出警告
   			drop_console: true, // 删除所有‘console’语句,可以兼容IE浏览器
   			collapse_vars: true, // 内嵌已定义但是只用到一次的变量
   			reduce_vars: true, // 提取出出现多次但是没有定义成变量去引用的静态值
   		}
   })
]
补充:webpack切换开发环境、生产环境

开发环境和生产环境的区别是调用的接口地址、资源存放地址、线上的资源是否需要压缩等方面
在package.json中设置一个node的全局变量,然后在webpack.config.js中进行生产环境和开发环境的配置切换

管理多页应用

按照之前单页的生成方法,出现多页的时候。每增加一页就需要配置一个new WebPlugin实例,同时将页面对应的入口加入entry配置项
解决方法之一:

web-webpack-plugin插件的功能:
WebPlugin为单个应用生成HTML
AutoWebPlugin管理多个单页应用,可以找到一个目录下所有的页面入口,自动为所有的页面入口配置一个WebPlugin输出对应的 html。

AutoWebPlugin支持所有WebPlugin支持的功能

AutoWebPlugin来解决问题,AutoWebPlugin强制规定了项目部分的代码结构
将所有单页应用的代码都放到一个目录pages下
一个单页应用对应一个文件夹,且每个文件夹都有一个index.js作为入口执行文件

然后修改webpack配置文件
webpack.config.js

const path = require('path');
const { AutoWebPlugin } = require('web-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

// 使用AutoWebPlugin自动寻找pages目录下的所有目录,将每一个目录看成一个单页应用
const autoWebPlugin  = new AutoWebPlugin('pages', {
    template: './template.html', // HTML模板文件所在的文件路径
    postEntrys:['./common.css'],// 所有的页面都依赖的共用的css样式文件
    // 提取所有页面的公共代码
    commonsChunk: { 
        name: 'common'// 提取出公共代码的Chunk名称
    }
});
module.exports = {
    // AutoWebPlugin会为寻找到的所有单页应用生成对应的入口配置
    // autoWebPlugin.entry方法可以获取所有由autoWebPlugin生成的入口配置
    entry: autoWebPlugin.entry({
			// 这里加入 我们额外需要的chunk入口
    }),
    output:{
        filename: '[name]_[chunkhash:8].js',
        path: path.resolve(__dirname, './dist'),
    },


    module: {
        rules: [
            {
                test: /\.js$/,
                use:['babel-loader'],
                exclude: path.resolve(__dirname, 'node_modules'),
            },
            {
                test: /\.css/,
                use: [
                     MiniCssExtractPlugin.loader,
                     'css-loader'
                ]
            }
        ]
    },
    plugins: [
        autoWebPlugin,
        new MiniCssExtractPlugin({
            filename: '[name]_[contenthash:8].css'
        })
    ]   
}

autoWebPlugin回味每个单页应用生成一个chunk配置和WebPlugin配置

同构应用

一份代码同时可以在浏览器和服务器中运行
目前大多的单页应用的视图都是通过JavaScript代码在浏览器渲染出来的,但是在浏览器渲染有不利于SEO、渲染性能的缺点
所以提出了SSR,核心在于虚拟DOM

webpack.config.js:用于构建浏览器环境
webpack_server.config.js:用于构建服务器环境

Electron

是Node.js和Chromium浏览器的结合体,用Chromium浏览器显示出的Web应用作为GUI,通过Node.js和操作系统交互。
Node.js和Chromium浏览器都是跨平台的,所以同一份代码可以不同操作系统运行。

Visual Studio Code 跨平台、开源、免费的编辑器,开发: TypeScript + Electron

离线应用

用webpack构建使用Service Workers接入的离线应用时候,社区里面有人做好插件
ServiceWorkerWebpackPlugin
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值