前端开发技术:Apollo、GraphQL与Webpack 4的实践应用
1. Apollo、GraphQL与推文应用
1.1 推文样式设置
在推文应用中,我们可以通过CSS设置删除和编辑按钮的样式。以下是相关代码:
.delete {
position: absolute;
right: 10px;
bottom: 10px;
cursor: pointer;
}
.edit {
position: absolute;
right: 30px;
bottom: 10px;
cursor: pointer;
}
1.2 推文操作流程
推文应用的操作流程如下:
1. 启动前端和后端(分别在不同终端),在浏览器访问
http://localhost:3000
即可看到应用界面。
2. 在文本框输入推文内容,点击 “Tweet it!” 按钮即可发布新推文。推文列表按时间降序排列,最新推文显示在顶部。
3. 若要编辑推文,点击编辑图标(铅笔图标),编辑完成后,移除文本框焦点(
onBlur
)即可保存修改。
4. 若要删除推文,点击删除图标(垃圾桶图标)即可。
1.3 GraphQL与Redux的关系
GraphQL 有可能取代 Redux,因为通过
ApolloProvider
可以直接访问数据,简化了数据获取和管理的过程。
2. Webpack 4 零配置
2.1 Webpack 4 简介
Webpack 是现代 JavaScript 应用的静态模块打包工具。从版本 4 开始,Webpack 无需配置文件即可打包项目,但仍可通过配置文件进行定制以满足不同需求。
2.2 操作步骤
- 创建项目文件夹并安装依赖 :
mkdir webpack-zero-configuration
cd webpack-zero-configuration
npm install --save-dev webpack webpack-cli
-
初始化
package.json文件 :
npm init -y
-
配置
package.json文件 :
{
"name": "webpack-zero-configuration",
"version": "1.0.0",
"description": "Webpack 4 Zero Configuration",
"main": "index.js",
"scripts": {
"build": "webpack"
},
"author": "Carlos Santana",
"license": "MIT",
"devDependencies": {
"webpack": "^4.6.0",
"webpack-cli": "^2.0.15"
}
}
- 运行打包命令 :
npm run build
此时可能会出现错误
ERROR in Entry module not found: Error: Can't resolver'./src'
,这是因为 Webpack 4 默认的入口文件是
src/index.js
。
5.
创建入口文件
:
// src/index.js
console.log('Index file...');
- 再次运行打包命令 :
npm run build
此时 Webpack 会在
dist
文件夹下生成
main.js
文件。同时,终端会提示未设置
mode
选项,Webpack 默认使用生产模式,生成的代码会被压缩和混淆。
2.3 模式设置
Webpack 4 有生产(
production
)和开发(
development
)两种模式。可以通过修改
package.json
文件来设置不同模式:
{
"name": "webpack-zero-configuration",
"version": "1.0.0",
"description": "Webpack 4 Zero Configuration",
"main": "index.js",
"scripts": {
"build-development": "webpack --mode development",
"build": "webpack --mode production"
},
"author": "Carlos Santana",
"license": "MIT",
"devDependencies": {
"webpack": "^4.6.0",
"webpack-cli": "^2.0.15"
}
}
运行
npm run build-development
命令,生成的代码不会被压缩。
2.4 集成 Babel
若要使用 Babel 转译 ES6 代码,可按以下步骤操作:
1.
安装依赖
:
npm install --save-dev babel-loader babel-core babel-preset-env
-
创建
.babelrc文件 :
{
"presets": ["env"]
}
-
配置
webpack.config.js文件 :
const webpackConfig = {
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: 'babel-loader'
}
]
}
};
module.exports = webpackConfig;
- 创建测试文件 :
// src/numbers.js
export const numbers = ['one', 'two', 'three'];
// src/index.js
import { numbers } from './numbers';
numbers.forEach(number => console.log(number));
- 运行打包命令 :
npm run build
也可以在终端直接使用
--module-bind
标志绑定加载器,而不使用配置文件:
{
"name": "webpack-zero-configuration",
"version": "1.0.0",
"description": "Webpack 4 Zero Configuration",
"main": "index.js",
"scripts": {
"build-development": "webpack --mode development --module-bind js=babel-loader",
"build": "webpack --mode production --module-bind js=babel-loader"
},
"author": "Carlos Santana",
"license": "MIT",
"devDependencies": {
"babel-core": "^6.26.3",
"babel-loader": "^7.1.4",
"babel-preset-env": "^1.6.1",
"webpack": "^4.6.0",
"webpack-cli": "^2.0.15"
}
}
2.5 其他绑定标志
Webpack CLI 还有其他绑定模块的标志:
-
--module-bind-post
:将扩展名绑定到后置加载器。
-
--module-bind-pre
:将扩展名绑定到前置加载器。
3. 向 Webpack 4 添加 React
3.1 准备工作
安装所需依赖:
npm install react react-dom babel-preset-react
3.2 操作步骤
-
配置
.babelrc文件 :
{
"presets": [
"env",
"react"
]
}
-
修改
webpack.config.js文件 :
const webpackConfig = {
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: 'babel-loader'
}
]
}
};
module.exports = webpackConfig;
-
创建
src/components/App.jsx文件 :
// Dependencies
import React from 'react';
// Components
import Home from './Home';
const App = props => (
<div>
<Home />
</div>
);
export default App;
-
创建
src/components/Home/index.jsx文件 :
import React from 'react';
const Home = () => <h1>Home</h1>;
export default Home;
-
修改
src/index.jsx文件 :
// Dependencies
import React from 'react';
import { render } from 'react-dom';
// Components
import App from './components/App';
render(<App />, document.querySelector('#root'));
-
安装
html-webpack-plugin插件 :
npm install --save-dev html-webpack-plugin
-
修改
webpack.config.js文件 :
const HtmlWebPackPlugin = require('html-webpack-plugin');
const webpackConfig = {
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: 'babel-loader'
}
]
},
plugins: [
new HtmlWebPackPlugin({
title: 'Codejobs',
template: './src/index.html',
filename: './index.html'
})
]
};
module.exports = webpackConfig;
-
创建
src/index.html文件 :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title><%= htmlWebPackPlugin.options.title %></title>
</head>
<body>
<div id="root"></div>
</body>
</html>
3.3 解决问题
运行
npm run build
命令时可能会出现错误
Can't resolve ./src directory
,这是因为 Webpack 无法识别
.jsx
文件。需要在
webpack.config.js
文件中添加
resolve
节点:
const HtmlWebPackPlugin = require('html-webpack-plugin');
const webpackConfig = {
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: 'babel-loader'
}
]
},
plugins: [
new HtmlWebPackPlugin({
title: 'Codejobs',
template: './src/index.html',
filename: './index.html'
})
],
resolve: {
extensions: ['.js', '.jsx']
}
};
module.exports = webpackConfig;
再次运行
npm run build
命令,即可成功打包,
dist
目录下会生成
index.html
和
main.js
文件。
3.4 优化配置
为了更好地组织和管理 Webpack 配置文件,可按以下步骤操作:
1. 将
webpack.config.js
文件重命名为
webpack.config.babel.js
,Babel 会自动处理该文件。
2. 将 ES5 代码迁移到 ES6:
import HtmlWebPackPlugin from 'html-webpack-plugin';
export default {
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: 'babel-loader'
}
]
},
plugins: [
new HtmlWebPackPlugin({
title: 'Codejobs',
template: './src/index.html',
filename: './index.html'
})
],
resolve: {
extensions: ['.js', '.jsx']
}
};
-
创建
webpack/configuration文件夹,并在其中创建各个配置文件:
// webpack/configuration/module.js
export default {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: 'babel-loader'
}
]
};
// webpack/configuration/plugins.js
import HtmlWebPackPlugin from 'html-webpack-plugin';
const plugins = [
new HtmlWebPackPlugin({
title: 'Codejobs',
template: './src/index.html',
filename: './index.html'
})
];
export default plugins;
// webpack/configuration/resolve.js
export default {
extensions: ['.js', '.jsx']
};
-
创建
webpack/configuration/index.js文件:
// Configuration
import module from './module';
import plugins from './plugins';
import resolve from './resolve';
export {
module,
plugins,
resolve
};
-
修改
webpack.config.babel.js文件:
import {
module,
plugins,
resolve
} from './webpack/configuration';
export default {
module,
plugins,
resolve
};
2.6 操作流程总结
以下是 Webpack 4 零配置及集成 Babel 的操作流程:
graph LR
A[创建项目文件夹] --> B[安装依赖]
B --> C[初始化package.json]
C --> D[配置package.json]
D --> E[运行打包命令]
E --> F{是否报错}
F -- 是 --> G[创建入口文件]
G --> E
F -- 否 --> H[设置模式]
H --> I[集成Babel]
2.7 模式对比
| 模式 | 特点 |
|---|---|
| 生产模式(production) | 代码会被压缩和混淆,适合部署到生产环境 |
| 开发模式(development) | 代码不会被压缩,方便开发调试 |
4. 添加 Webpack Dev Server 和 CSS 预处理器
4.1 准备工作
安装所需依赖:
npm install webpack-dev-server css-loader extract-text-webpack-plugin@v4.0.0-beta.0 style-loader
若要使用 Sass,需安装:
npm install sass-loader node-sass
若使用 Stylus,需安装:
npm install stylus-loader stylus
若使用 LessCSS,需安装:
npm install less-loader less
4.2 添加 Webpack Dev Server
-
修改
package.json文件 :
{
"scripts": {
"start": "webpack-dev-server --mode development --open",
"build-development": "webpack --mode development",
"build": "webpack --mode production"
}
}
--mode
标志指定模式(默认是生产模式),
--open
标志在启动应用时打开浏览器。
2.
运行应用
:
npm start
应用默认使用端口 8080,若要更改端口,可使用
--port
标志:
{
"scripts": {
"start": "webpack-dev-server --mode development --open --port 9999"
}
}
-
实时更新示例
:
修改src/components/Home/index.jsx文件:
import React from 'react';
const Home = () => <h1>Updated Home</h1>;
export default Home;
修改后,页面会自动更新,无需手动刷新。
4.3 添加 CSS 预处理器
4.3.1 修改
webpack/configuration/module.js
文件
export default {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: 'babel-loader'
},
{
test: /\.scss$/, // Can be: .scss or .styl or .less
use: [
{
loader: 'style-loader'
},
{
loader: 'css-loader',
options: {
// Enables CSS Modules
modules: true,
// Number of loaders applied before CSS loader
importLoaders: 1,
// Formatting CSS Class name
localIdentName: '[name]_[local]_[hash:base64]',
// Enable/disable sourcemaps
sourceMap: true,
// Enable/disable minification
minimize: true
}
},
{
loader: 'sass-loader' // sass-loader or stylus-loader or less-loader
}
]
}
]
};
4.3.2 使用 Sass
-
创建
src/components/Home/Home.scss文件 :
$color: red;
.Home {
color: $color;
}
-
修改
src/components/Home/index.jsx文件 :
import React from 'react';
import styles from './Home.scss'; // For Sass
const Home = () => <h1 className={styles.Home}>Updated Home</h1>;
export default Home;
4.3.3 使用 Stylus
-
创建
src/components/Home/Home.styl文件 :
$color = green
.Home
color: $color
-
修改
webpack/configuration/module.js文件中的test和loader配置以适配 Stylus。
4.3.4 使用 LessCSS
-
创建
src/components/Home/Home.less文件 :
@color: blue;
.Home {
color: @color;
}
-
修改
webpack/configuration/module.js文件中的test和loader配置以适配 LessCSS。
4.4 操作流程总结
以下是添加 Webpack Dev Server 和 CSS 预处理器的操作流程:
graph LR
A[安装依赖] --> B[修改package.json添加启动脚本]
B --> C[运行应用]
C --> D{是否更改端口}
D -- 是 --> E[修改启动脚本添加端口设置]
E --> C
D -- 否 --> F[修改模块配置文件添加CSS预处理器规则]
F --> G{选择CSS预处理器}
G -- Sass --> H[创建Sass文件并引入]
G -- Stylus --> I[创建Stylus文件并修改配置]
G -- LessCSS --> J[创建LessCSS文件并修改配置]
4.5 不同 CSS 预处理器对比
| 预处理器 | 特点 | 示例文件扩展名 |
|---|---|---|
| Sass | 功能强大,支持变量、嵌套、混合等特性 |
.scss
|
| Stylus | 语法简洁,灵活性高 |
.styl
|
| LessCSS | 易于学习,与 CSS 语法相似 |
.less
|
超级会员免费看
845

被折叠的 条评论
为什么被折叠?



