模块化
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"}
