模块化
AMD:Require.js异步模块规范,是RequireJS在推广过程中对模块定义的规范化产出的,推崇依赖前置,异步加载; CMD:是Sea.js 在推广过程中对模块定义的规范化产出的,推崇依赖就近,同步加载; CommonJS:NodeJS模块系统具体实现的基石。
- 模块分为单文件模块和包
- 模块成员导出:module.exports和exports
- 模块成员导入:require(‘模块标识符’)
UMD:兼容AMD和CommonJS规范的同时,还兼容全局引用的方式; ES6:ES6模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量; 其中AMD和CMD的语法类似,都是使用define和require来进行模块的定义和加载;CommonJS 则使用的是moduel.exports、exports和require来紧密模块的定义和加载。然而从本质上来讲,它们都没有解决根本问题: 性能低:浏览器最怕从服务器加载又小又多的文件; 模块之间的管理之类的问题; 都是JavaScript函数模拟实现的,需要第三方库的支持; 而ES6(ECMAScript2015)可以说是一个“跨时代”的更新,使得的JavaScript在原生语言上实现了模块化:export和import。ES6的原生模块功能,它兼顾了规范、语法简约型和异步加载功能,还支持循环依赖。是不是很强大。
babel
- 安装如下内容
npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/node
- 继续安装polyfill
npm install --save @babel/polyfill
创建babel.config.js文件并配置如下内容
const presets = [
["@babel/env",{
target: {
edge: "17",
firefox: "60",
chrome: "67",
safari: "11.1"
}
}]
]
module.exports = {
presets
}
执行一下命令
npx babel-node index.js
ES6模块化
默认导入导出
- 默认导出语法 export default 默认导出成员
- 默认导入语法 import 接收名称 from ‘模块标识符’
按需导入导出
- 执行
npm install webpack webpack-cli -D
- 在项目根目录中创建 webpack.config.js 配置文件,并初始化如下代码:
module.exports = {
mode: 'development' //指定构建模式
}
- 在 package.json 配置文件的script节点中,增加如下代码:
"script":{
"dev": "webpack"
}
- 执行
npm run dev
命令
配置打包的入口和出口
配置webpack的自动打包功能
- 执行
npm install webpack-dev-server -D
- 在 package.json 配置文件的script节点中,增加如下代码:
"script":{
"dev": "webpack",
//"dev": "webpack-dev-server --open --host 127.0.0.1 --port 8888"
}
- 将src目录下的index.html文件script脚本的引用路径,修改为’./buldle.js’
- 执行
npm run dev
命令- 在浏览器输入
http://localhost:8080
查看效果
配置html-webpack-plugin
- 执行
npm install html-webpack-plugin -D
- 修改webpack.config.js文件,添加如下配置代码:
const HtmlWebpackPlugin = require('html-webpack-plugin');
const htmlPlugin = new HtmlWebpackPlugin({
template: './src/index.html',
filename: 'index.html'
})
- 修改webpack.config.js文件,添加如下配置代码:
module.exports = {
plugins: [htmlPlugin]
}
Loader
打包处理CSS
- 执行
npm i style-loader css-loader -D
- 在webpack.config.js的module中的rules,添加如下loader规则:
module: {
rules: [
{test:/\.css$/, use:['style-loader','css-loadder']}
]
}
打包处理Less
- 执行
npm i less-loader less -D
- 在webpack.config.js的module中的rules,添加如下loader规则:
module: {
rules: [
{test:/\.less/, use:['style-loader','css-loadder','less-loader']}
]
}
打包处理Scss
- 执行
npm i sass-loader node-sass -D
- 在webpack.config.js的module中的rules,添加如下loader规则:
module: {
rules: [
{test:/\.scss/, use:['style-loader','css-loadder','sass-loader']}
]
}
配置postCSS自动添加css兼容前缀
- 执行
npm i postcss-loader autoprefixer -D
- 在项目根目录创建postcss.config.js文件,并初始化如下代码:
const autoprefixer = require('autoprefixer');
module.exports = {
plugins: [autoprefixer]
}
- 在webpack.config.js的module中的rules,添加如下loader规则:
module: {
rules: [
{test:/\.css/, use:['style-loader','css-loadder','postcss-loader']}
]
}
打包处理图片和字体文件
- 执行
npm i url-loader file-loader -D
- 在项目根目录创建postcss.config.js文件,并初始化如下代码:
module: {
rules: [
{
test:/\.jpg|png|gif|bmp|ttf|eot|svg|woff|woff2$/,
use:['url-loader?limit=16940']}
]
}
打包处理高级语法
- 执行
npm i babel-loader @babel/core @babel/runtime -D
- 执行
npm i @babel.preset-env @babel/plugin-transform-runtime @babel/plugin-proposal-class-properties -D
- 在项目根目录创建babel.config.js文件,并初始化如下代码:
module.exports = {
presets: ['@babel/preset-env'],
plugins: ['@babel/plugin-transform-runtime','@babel/plugin-proposal-class-properties']
}
- 在webpack.config.js的module中的rules,添加如下loader规则:
module: {
rules: [
test:/\.js$/,use:'babel-loader',exclude: /node_modules/}
]
}
配置Vue组件加载器
- 执行
npm i vue-loader vue-template-compiler -D
- 在webpack.config.js的配置文件中,添加如下vue-loader规则:
const VueLoaderPlugin = require('vue-loader/lib/plugin');
module.exports = {
module: {
rules: [
{test:/\.vue$/,loader:'vue-loader'}
]
},
plugins: [
new VueLoaderPlugin()
]
}
- 执行
npm i vue -S
- 在src目录下的index.js入口文件中,配置如下代码
import Vue from 'vue'
import App from './components/App.vue'
const vm = {
el: '#app',
render: h => h(App)
}
webpack打包发布
修改package.json中代码
"script": {
//用于打包命令
"builde": "webpack -p",
//用于开发调试命令
"dev": "webpack-dev-server --open --host 127.0.01 --port 3000"
}