代码组织结构

package.json
webpack
src(核心代码的存储,里面的结构怎么存储没啥限制)
README.md(说明文档)
tsconfig.json(如果用ts开发需要有)
dist(打包后自动,主要是代码的编译结果,用于供外部调用)


基本的就包含上面这些,其他随意

步骤

整体流程可以参考文献7

初始化

通过npm init -y命令创建初始的packjson.json文件。基本形式如下(详细解释请看下面的【配置文件说明】部分):

  1. {
  2. "name": "sdktest",
  3. "version": "1.0.0",
  4. "description": "",
  5. "main": "index.js",
  6. "scripts": {
  7. "test": "echo \"Error: no test specified\" && exit 1"
  8. },
  9. "keywords": [],
  10. "author": "",
  11. "license": "ISC"
  12. }

webpack初始化

在vscode安装webpack插件,如下图:
Snipaste-20220303_173355.png
安装完成后,按F1键,输入webpack create,点击匹配项,将会自动在package.json中添加webpack相关配置。
Snipaste-20220303_173559.png

  1. "devDependencies": {
  2. "@babel/core": "^7.2.2",
  3. "@babel/preset-env": "^7.3.1",
  4. "babel-loader": "^8.0.5",
  5. "webpack": "^4.29.0",
  6. "webpack-cli": "^3.2.1",
  7. "webpack-dev-server": "^3.1.14"
  8. }

注意插件创建的版本比较底,可以自己安装一个package-json-upgrade插件,依据系统提示升级到最新版本(统一升级)
Snipaste-20220303_184955.png

安装依赖

使用npm install命令安装添加的依赖项

设置webpack配置文件

  1. module.exports = {
  2. mode:'',
  3. entry:{
  4. ……
  5. },
  6. output:{
  7. ……
  8. }
  9. }

基本配置包含上面这些(详细解释请看下面的【配置文件说明】部分)

编写sdk实现代码

具体参见下面的【源码结构和基本语法】部分

本地测试运行

配置好后,运行npm start,系统就会启动本地服务,运行成功后可以进行本地调试

打包

以上全部设置好以后,直接运行npm run build即可

上传

通过命令上传到npmjs的数据库中,具体参见【发布到npm】部分

配置文件说明

package.json

关于package.json的详细说明可以参考文献1和文献2,这里仅列出必要的部分(最基本的部分)

  1. // *标识必填
  2. {
  3. "name": "cfloggerjs", // *用于告知应用程序或软件包的名称
  4. "version": "1.0.0", // *版本号,软件包发布时别人看到的版本号
  5. "description": "", // 应用程序/软件包的简短描述
  6. "main": "./dist/cfloggerjs.min.js", // 应用程序的入口点
  7. "scripts": { // *定义了一组可以运行的 node 脚本,基本的要包含调试和编译
  8. "start": "webpack-dev-server --config webpack/webpack.dev.js", // 调试时用webpack-dev-server命令
  9. "build": "webpack --config webpack/webpack.prod.js" // 打包时用webpack命令,具体区别看下面的webpack部分
  10. },
  11. "repository": { // *此程序包仓库所在的位置
  12. "type": "git",
  13. "url": "http://code.cityfun.com.cn/tfs/CF-TEAM/……/_git/LogSDK"
  14. },
  15. "keywords": [ // *关键词,这有助于人们在浏览相似的软件包或浏览npm网站时找到你的软件包
  16. "log",
  17. "record",
  18. "upload"
  19. ],
  20. "author": "cityfun", // *作者信息,此为简版,其他格式参考文献1
  21. "license": "MIT", // *软件包的许可证
  22. "devDependencies": { // *开发依赖安装的 npm 软件包的列表,通过npm i xxx --save-dev安装时会自动加上,一般不需要手动维护
  23. "@babel/core": "^7.2.2",
  24. "@babel/preset-env": "^7.3.1",
  25. "babel-loader": "^8.0.5",
  26. "dom-element-path": "^1.3.1",
  27. "html-webpack-plugin": "^5.5.0",
  28. "ts-loader": "^9.2.6",
  29. "typescript": "^4.5.5",
  30. "webpack": "^5.69.1",
  31. "webpack-cli": "^4.9.2",
  32. "webpack-dev-server": "^4.7.4",
  33. "webpack-merge": "^5.8.0"
  34. }
  35. }

webpack

关于webpack的设置有2种方式:

  1. 直接写到运行命令行(直接在命令行中运行需要全局安装webpack)中,比如webpack .\src\main.js .\dist\bundle.js,这种适合于比较简单的配置场景。
  2. 通过配置文件的方式,上面的package.json中的设置就是配置文件的方式,通过—config 文件路径就可以指定配置文件。通过配置文件有2个好处:1.可以满足更复杂的配置;2.不用记住那么多命令,配好后后面直接引用就行,一般也不用再修改

关于webpack的详细使用方式可以参考文献3和文献4(视频教程)

  1. // webpack是基于nodejs的,所以他的语法也是nodejs语法,引用用require
  2. const path = require('path');
  3. // 必须写module.exports
  4. module.exports = {
  5. mode: 'none', // 模式,包含none、production、development,不同模式主要影响DefinePlugin,具体可以看下图
  6. entry: { // 输入,如果传入一个字符串或字符串数组,chunk 会被命名为 main(比如打包就会变成main.js)。如果传入一个对象,则每个属性的键(key)会是 chunk 的名称,该属性的值描述了 chunk 的入口点(此时打包就会生成{{key}}.js)
  7. 'cfloggerjs.min': './src/index.js',
  8. },
  9. output: { // 输出
  10. filename: '[name].js', // [name].js的形式就会自动按上面的key值命名
  11. libraryExport: 'default', // 可能会停止支持,官方建议使用'library.export'。该节点表示入口的默认导出将分配给 library target
  12. library: 'cfloggerjs', // 在使用包时,import的名称或declare var声明的名称
  13. libraryTarget: 'umd', // 可能会停止支持,官方建议使用'library.type'。该节点表示将你的 library 暴露为所有的模块定义下都可运行的方式
  14. path: path.join(__dirname, '../dist'), // 输出的路径,__dirname为nodejs的内置api,表示当前文件所在的文件夹路径
  15. },
  16. module: {
  17. rules: [{ // loader配置,下面的表示使用ts-lodaer转换ts,ts浏览器无法解析,需要通过loader转换后使用
  18. test: /\.ts?$/,
  19. use: 'ts-loader',
  20. exclude: /node_modules/,
  21. },]
  22. },
  23. resolve: { // 在引入模块时,如果没有写后缀,那么webpack会在该目录下去查找有没有.ts或者.js文件
  24. extensions: ['.ts', '.js'],
  25. },
  26. }

Snipaste-20220304_113540.png
Snipaste-20220304_120119.png

  1. // 引入其他webpack配置
  2. const base = require('./webpack.base.js');
  3. 通过插件可以将webpack配置融合
  4. const {
  5. merge
  6. } = require('webpack-merge');
  7. const htmlWebpackPlugin = require('html-webpack-plugin');
  8. module.exports = merge(base, {
  9. mode: 'development',
  10. // 调试的设置
  11. devServer: {
  12. open: true, // 自动打开
  13. host: 'localhost', // 使用本地localhost地址
  14. port: 4001, // 调试使用的端口号
  15. },
  16. plugins: [
  17. // 该插件可以实现基于模板,自动在【内存中】创建一个带包引用的index.html文件,不用自己再去打包引入,写地址
  18. new htmlWebpackPlugin({
  19. template: './src/log/template.html',
  20. filename: 'index.html'
  21. })
  22. ]
  23. })

源码结构和基本语法

  1. // 引入在ts中定义的类(export class Logger{……}),对应webpack中entry节点的引用路径,作为主入口
  2. import {
  3. Logger
  4. } from './log/log.ts'
  5. // 导出
  6. export default {
  7. Logger
  8. };
  9. // export defalt在import的时候,需要加{},如果时export,则不需要,对应的形式为import {a} from 'x';import a from 'x'

发布到npm

主要参考文献5

注册npm账号(私有源可忽略)

这部分忽略不讲,需要的可以参考结尾的文献6,需要注意的是npm网站的登录或本地包发布到npm服务器时一版需要输入动态验证码,如果是邮件的话可能会有延迟(15min-30min)左右(不确定是不是公司邮箱的问题,有条件可以用google邮箱或其他国外邮箱试一下),可以在创建成功后绑定一下微软的Authenticator(一个App),解决验证码延迟的问题。

指定包发布地址

一般包都发布到npm官方网站上,但是由于网络的原因,绝大多数人可能并没有用npm官方的源(可能是taobao或其他源,甚至是私有源)。需要指定好源地址,不然无法验证账号。提供2种方法:

全局修改

比如用nrm,可以快速切换源

项目中配置

Snipaste-20220303_163342.png

添加用户

  1. 控制台输入npm adduser
  2. 按照提示分别输入用户名和密码,其中输入密码时控制台不会显示任何字符,但要注意这的确是输入了
  3. 输入验证码

    配置.npmignore

    发布一个包,考虑到别人的下载速度,包体积肯定需要尽量小,所以源文件最好不包括,那如何控制只发哪些文件呢? 第一种方式是在 package.json 里 files 字段来控制,files 字段的值是一个数组,你可以写具体文件名,也可以写目录,还支持 glob 模式。 第二种就是使用 .npmignore 配置文件,他类似于 .gitignore 文件,其实如果没有 .npmignore,会使用.gitignore来取代他的功能。在包的根目录下,.npmignore不会覆盖 files 字段,但在子目录中会覆盖。

通过在根目录创建该文件,限制上传到npm上的文件,以下设置供参考

  1. /node_modules
  2. /src
  3. /.vscode
  4. /webpack
  5. /tsconfig.json
  6. /package-lock.json
  7. /test.html
  8. /config
  9. *.zip

更新版本(如果需要)

初始化版本后,如果后续包有修改,需要修改版本号。以下提供2种方法:

手动修改

在package.json中version节点手动修改版本,但是这样容易跳版本,或者产生不规范的版本号,除非自动修改无法实现,一般不建议手动修改。

自动修改

Snipaste-20220303_151944.png

发布应用

注意npm上不能存在同名或类似(比如a_b和a-b,npm会认为名称类似),所以在发布前最好在npm上搜索以下有无同名的包,如果有,建议修改一下再发布。
以上问题全部解决后,输入npm publish即可发布。
注意此时可能会再要求输入验证码,按提示输入即可。

如果要发布测试包,可以参考

Snipaste-20220303_151436.png

参考文献

  1. package.json 指南
  2. package.json | npm Docs
  3. 概念 | webpack 中文文档
  4. webpack最基本的使用方式 - 前端自动化构建工具 Webpack
  5. npm 发包者必读 - 掘金(印象笔记有备份)
  6. npm包的发布与删除 - SegmentFault 思否
  7. 手把手,教你实现并发布一个公用 npm 组件-技术圈