前端常用開發(fā)工具的路徑解析配置
本文是 Webpack CheatSheet | Webpack 基礎(chǔ)與實(shí)踐清單的一部分,項(xiàng)目代碼可以參考 fe-boilerplate | 多技術(shù)棧前端項(xiàng)目模板。
路徑解析
隨著需求的迭代與功能的完善,我們的項(xiàng)目也會愈發(fā)龐大而復(fù)雜,目錄層級結(jié)構(gòu)也會不斷深化;以 React 實(shí)踐清單中討論的 React 項(xiàng)目組織方式為例,我們常會分為 components, containers, services, apis, ducks, store, i18n 等等目錄,如果全部以相對路徑方式引入,可能會變成這個(gè)樣子:
- import React from 'react';
 - import { connect } from 'react-redux';
 - import { someConstant } from './../../config/constants';
 - import MyComponent from './../../../components/MyComponent';
 - import { myActionCreator } from './../../../ducks/someReducer';
 
毫無疑問,這樣繁多的引用不可避免地會導(dǎo)致代碼之間耦合度的增加,使得更難以重構(gòu)或者優(yōu)化。在適當(dāng)?shù)啬K劃分的基礎(chǔ)上,我們希望在跨模塊引用時(shí),能夠以絕對路徑的方式,譬如:
- import React from 'react';
 - import { connect } from 'react-redux';
 - import { someConstant } from 'Config/constants';
 - import MyComponent from 'Components/MyComponent';
 - import { myActionCreator } from 'Ducks/someReducer';
 
當(dāng)然,我們并不提倡過度地使用絕對路徑引入,對于相對關(guān)系固定的組件,還是應(yīng)該優(yōu)先使用相對路徑方式引入。
Webpack
如前文介紹,Webpack 允許我們使用 resolve.alias 來自定義路徑解析:
- module.resolve = {
 - alias: {
 - Config: path.resolve(__dirname, '..', 'src', 'config'),
 - Components: path.resolve(__dirname, '..', 'src', 'components'),
 - Ducks: path.resolve(__dirname, '..', 'src', 'ducks'),
 - Shared: path.resolve(__dirname, '..', 'src', 'shared'),
 - App: path.join(__dirname, '..', 'src')
 - }
 - };
 
開發(fā)工具的支持是不可避免地因素,值得高興的是 VSCode 允許我們在 jsconfig.json 中配置解析規(guī)則,Auto-Import 這樣的自動導(dǎo)入工具同樣能識別這些規(guī)則:
- {
 - "compilerOptions": {
 - "target": "es2017",
 - "allowSyntheticDefaultImports": false,
 - "baseUrl": "./",
 - "paths": {
 - "Config/*": ["src/config/*"],
 - "Components/*": ["src/components/*"],
 - "Ducks/*": ["src/ducks/*"],
 - "Shared/*": ["src/shared/*"],
 - "App/*": ["src/*"]
 - }
 - },
 - "exclude": ["node_modules", "dist"]
 - }
 
ESLint
ESLint 同樣是前端開發(fā)不可或缺的部分,我們可以使用 eslint-import-resolver-webpack 來擴(kuò)展 eslint-import 的模塊解析,使用 npm 安裝該模塊之后進(jìn)行如下配置:
- ---
 - settings:
 - import/resolver: webpack # take all defaults
 
或者指定文件名:
- ---
 - settings:
 - import/resolver:
 - webpack:
 - config: 'webpack.dev.config.js'
 - config-index: 1 # optional, take the config at index 1
 
對于未使用 Webpack 的項(xiàng)目,則可以考慮使用 eslint-import-resolver-alias:
- // .eslintrc.js
 - module.exports = {
 - settings: {
 - 'import/resolver': {
 - alias: {
 - map: [
 - ['babel-polyfill', 'babel-polyfill/dist/polyfill.min.js'],
 - ['helper', './utils/helper'],
 - ['material-ui/DatePicker', '../custom/DatePicker'],
 - ['material-ui', 'material-ui-ie10']
 - ],
 - extensions: ['.ts', '.js', '.jsx', '.json']
 - }
 - }
 - }
 - };
 
Jest
我們可以在 package.json 中的 jest 配置項(xiàng)中添加 moduleNameMapper 屬性:
- "jest": {
 - "moduleNameMapper": {
 - "^Config(.*)$": "<rootDir>/src/config$1",
 - "^Components(.*)$": "<rootDir>/src/components$1",
 - "^Ducks(.*)$": "<rootDir>/src/ducks$1",
 - "^Shared(.*)$": "<rootDir>/src/shared$1",
 - "^App(.*)$": "<rootDir>/src$1"
 - }
 
TypeScript
TypeScript 的配置類似于 VSCode,在 tsconfig.json 的 compilerOptions 選項(xiàng)中添加如下配置:
- {
 - "baseUrl": ".",
 - "paths": {
 - "c-apis/*": ["src/apis/*"],
 - "c-models/*": ["src/models/*"],
 - "c-stores/*": ["src/stores/*"],
 - "c-utils/*": ["src/shared/*"]
 - }
 - }
 
【本文是51CTO專欄作者“張梓雄 ”的原創(chuàng)文章,如需轉(zhuǎn)載請通過51CTO與作者聯(lián)系】















 
 
 



 
 
 
 