前端学习第十八天——ES6之Module模块
Module
引入模块
<script src="./index.js" type="module"></script>
一个文件就是一个模块
只要会用到import
或export
,在使用script
标签加载的时候,就要加上 type="module"
Module
的导入和导出
const age = 18;
export default age;
import age from './module.js';
console.log(age);
export
和对应的import
export
后面接返回的声明或语句
export const age = 18;
const age = 18;
export { age }
// 不能随意修改引入的变量名
import { age } from './module.js';
不能导入匿名的函数或类
- 导入导出多个
export { fn, className, age };
import { fn, age, className } from './module.js';
- 导出导入时起别名
export { fn as func, className, age };
import { func, age, className as Person } from './module.js';
// 导入全部
import * as obj from './module.js';
- 同时导入
一定是export default
的在前
import age2, { func, age, className } from './module.js';
注意事项
- 模块顶层的 this 指向
模块中,顶层的 this 指向 undefined import
和import()
import
命令具有提升效果,会提升到整个模块的头部,率先执行。
import()
可以按条件导入- 导入导出的复合写法
复合写法导出的,无法在当前模块中使用
export { age } from './module.js';
// 等价于
// import { age } from './module.js';
// export { age } from './module.js';
Babel
官网:https://babeljs.io/
在线编译:https://babeljs.io/repl
Babel 是 JavaScript 的编译器,用来将 ES6 的代码,转换成 ES6 之前的代码
Babel
本身可以编译 ES6 的大部分语法,比如 let
、const
、箭头函数
、类。但是对于 ES6 新增的 API
,比如 Set
、Map
、Promise
等全局对象,以及一些定义在全局对象上的方法都不能直接编译,需要借助其它的模块。
Babel
一般需要配合webpack
来编译模块语法
Babel
的使用方式
配置npm淘宝镜像源
npm config set registry https://registry.npm.taobao.org
- 安装
Babel
安装最新版本
npm install --save-dev @babel/core @babel/cli
安装指定版本
npm install --save-dev @babel/[email protected] @babel/[email protected]
Babel
配置和执行
打开package.json文件。在scripts
中添加"build":"babel src -d dist"
"scripts": {
"build":"babel src -d dist"
}
接下来执行npm run build
。然而并没有任何变化。因为我们没有Babel
的配置文件
执行下面的命令,安装@babel/preset-env
npm install @babel/preset-env --save-dev
在项目根目录中创建.babelrc
配置文件。
在文件中添加配置内容。
{
"presets": ["@babel/preset-env"]
}
重新执行npm run build
命令。会在目标文件夹下生成目标代码。
webpack
webpack
是静态模块打包器,当使用 webpack
处理应用程序时,会将所有这些模块打包成一个或多个文件。
模块:webpack
可以处理 js/css/图片、图标字体等
静态:开发过程中存在于本地的 js/css/图片/图标字体等文件,就是静态的。动态的内容,webpack
没办法处理,只能处理静态的
- 安装
Webpack
npm install --save-dev [email protected] [email protected]
const path = require('path');
module.exports = {
// 指定打包模式为开发模式
mode:'development',
entry:'./src/index.js',
output:{
path:path.resolve(__dirname, 'dist'),
filename:'bundle.js'
}
};
在package.json
文件中配置命令
"scripts": {
"webpack":"webpack --config webpack.config.js"
}
entry和output
entry入口起点(entry point)指示 webpack
应该使用哪个模块,来作为构建其内部 依赖图(dependency graph) 的开始。进入入口起点后,webpack
会找出有哪些模块和库是入口起点(直接和间接)依赖的。
单入口
entry: './src/index.js',
多入口
entry: {
main: './src/index.js',
search: './src/search.js'
},
output选项可以控制 webpack 如何向硬盘写入编译文件。
单入口
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js'
}
多入口
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].js'
}
loader
webpack
只能理解 JavaScript 和 JSON 文件。loader 让 webpack
能够去处理其他类型的文件,并将它们转换为有效 模块,以供应用程序使用,以及被添加到依赖图中。
安装babel-loader
npm install --save-dev [email protected]
配置loader
在 webpack 的配置中 loader 有两个属性:
1. test 属性,用于标识出应该被对应的 loader 进行转换的某个或某些文件。
2. use 属性,表示进行转换时,应该使用哪个 loader。
module.exports = {
module: {
rules: [
{ test: /\.css$/, use: 'css-loader' },
{ test: /\.ts$/, use: 'ts-loader' }
]
}
};
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel-loader'
}
]
}
引入 core-js,编译新增 API
npm install --save-dev [email protected]
在要编译的文件中,引入core-js
import "core-js/stable";
plugin
loader 用于转换某些类型的模块,而插件则可以用于执行范围更广的任务。包括:打包优化,资源管理,注入环境变量。
https://www.webpackjs.com/plugins/
安装html-webpack-plugin
npm install --save-dev [email protected]
配置 html-webpack-plugin 插件
引入
const HtmlWebpackPlugin = require('html-webpack-plugin');
单入口
new HtmlWebpackPlugin({
template: './index.html'
})
多入口
new HtmlWebpackPlugin({
template: './index.html',
filename: 'index.html',
chunks: ['index'],
minify: {
// 删除 index.html 中的注释
removeComments: true,
// 删除 index.html 中的空格
collapseWhitespace: true,
// 删除各种 html 标签属性值的双引号
removeAttributeQuotes: true
}
}),
new HtmlWebpackPlugin({
template: './search.html',
filename: 'search.html',
chunks: ['search']
})
处理CSS文件
- 安装
npm install --save-dev css-[email protected]
npm install --save-dev [email protected]
npm install -- save-dev mini-css-[email protected]
style-loader将CSS文件以style标签的方式引入
mini-css-extract-plugin将CSS文件以link方式引入
2. 配置
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module: {
rules: [
{
test: /\.css$/,
// use: ['style-loader', 'css-loader']
// 从右向左使用loader
use: [MiniCssExtractPlugin.loader, 'css-loader']
}
]
},
plugins: [
new HtmlWebpackPlugin({
template: './index.html',
filename: 'index.html'
}),
new MiniCssExtractPlugin({
filename: 'css/[name].css'
})
]
处理CSS中的图片
- 安装
npm install --save-dev [email protected]
file-loader,复制一份到打包路径,同时修改文件和引用路径。但引入的图片路径会出现问题。原因是MiniCssExtractPlugin和file-loader有一些冲突。
修改办法如下,在MiniCssExtractPlugin的配置中添加publicPath
公共路径…/。
2. 配置
module: {
rules: [
{
test: /\.css$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
publicPath: '../'
}
},
'css-loader'
]
},
{
test: /\.(jpg|png|gif)$/,
use: {
loader: 'file-loader',
options: {
name: 'img/[name].[ext]'
}
}
}
]
}
在file-loader中配置参数name: 'img/[name].[ext]'
可以将文件放到指定的文件下。
处理HTML中的图片
- 安装
npm install --save-dev [email protected]
- 配置
在file-loader中配置参数esModule: false
。可以解决打包完的图片路径变为模块{"default":"img/1.png"}
module: {
rules: [
{
test: /\.(jpg|png|gif)$/,
use: {
loader: 'file-loader',
options: {
name: 'img/[name].[ext]',
esModule: false
}
}
},
{
test: /\.(htm|html)$/,
loader: 'html-withimg-loader'
}
]
},
url-loader
- 安装
npm install --save-dev [email protected]
- 配置
limit:3000
限制小于3kb的图片转为base64格式,大于3kb还是用file-loader进行操作。
module: {
rules: [
{
test: /\.(jpg|png|gif)$/,
use: {
loader: 'url-loader',
options: {
name: 'img/[name].[ext]',
esModule: false,
limit: 3000
}
}
}
]
},
url-loader只能处理CSS和Js里面的图片,不能处理HTML里面的图片。
url-laoder不能替代file-loader
使用webpack-dev-server搭建开发环境
- 安装
- 配置
在package.json文件中配置。
"scripts": {
"dev": "webpack-dev-server --open chrome"
},
ng|gif)$/,
use: {
loader: ‘url-loader’,
options: {
name: ‘img/[name].[ext]’,
esModule: false,
limit: 3000
}
}
}
]
},
url-loader只能处理CSS和Js里面的图片,不能处理HTML里面的图片。
url-laoder不能替代file-loader
### 使用webpack-dev-server搭建开发环境
1. 安装
2. 配置
在package.json文件中配置。
```Jaon
"scripts": {
"dev": "webpack-dev-server --open chrome"
},
在命令行中,运行npm run dev
,将会进行打包项目,同时打开谷歌浏览器。在我们修改代码时,保存也会进行动态的更新。打包生成的dist
目录会存在内存中,不会存在磁盘中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。